100台までのホストに対する単純なAnsibleプレイブックの合理的なパフォーマンスとは


11

古いcfengine2インストールを置き換えるAnsibleを検討し始めています。私は簡単なプレイブックを持っています:

  • sudoersファイルをコピーします
  • テンプレート化されたresolv.confをコピーします(group_varsおよびhost_varsデータを供給)
  • いくつかのサービスが実行されていることを確認します
  • ローカルユーザーの存在を確認します

プレイブックは、97台のマシン(すべてが1ギガまたは10ギガの高速ネットワークで接続され、LANレイテンシが1ミリ秒未満)に対して実行するのに4分以上のウォールクロック時間を要し、2コア4GメモリVMでCPUの50%以上を消費しますそれを実行します。

1台のマシンに対して実行するのに約11秒かかり、約4秒のuser + sys CPU時間を消費しますが、TBHは依然として作業量に対して少し過剰に見えます。

明らかなビット:

  • playbook-dir local ansible.cfgでパイプライン処理を明示的に有効にしました
  • 同じローカルansible.cfgが有効なjsonfileへのファクトキャッシングがあります
  • 私はフォークを50に設定しています、同じです(他の値を試しました)
  • AnsibleはParamikoではなくSSHを使用しており、永続的な制御ソケットを使用していると確信しています-実行中にSSHプロセスが開始されて永続化していることがわかります。

このレベルのパフォーマンスは正常ですか、セットアップに問題がありますか?もしそうなら、どうすれば決定できますか?

編集:2017年8月現在、この問題は引き続き発生しています。Ansibleバージョンは2.2.1であり、プレイブックのサイズは現在拡大しています。最新の番号:

  • 98ホスト
  • ansible -m ping all 4.6秒の実時間、3.2秒のユーザー、2.5秒のsys時間
  • 完全なプレイブックの実行には4分かかり、実行中に100%のユーザーと〜35%のシステムCPUを使用します(2コアVM展開サーバーでは、100%が1つのフルCPUです)
  • ターゲットOSは主にCentOS 7、一部のCentOS 6です。
  • プロファイリングでは、特定のタスクのホットスポットは明らかになりません

プレイブックは現在はるかに大きくなっていますが、プレイブックサーバーのCPU負荷のレベルを正当化するものはまだないと思います。私が見る限り、それは主にファイルのコピーといくつかのテンプレートの拡張です。

host / groupvarsを非常に広範囲に使用していることに注意してください

何人かの人々がプロファイリング、プロファイリングの実行のテールについて尋ねてきました:

Tuesday 01 August 2017  16:02:24 +0100 (0:00:00.539)       0:06:22.991 ******** 
=============================================================================== 
yumrepo : centos repos -------------------------------------------------- 9.77s
sshd : copy CentOS 6 sshd config ---------------------------------------- 7.41s
sshd : copy CentOS 7 sshd config ---------------------------------------- 6.94s
core : ensure core packages are present --------------------------------- 6.28s
core : remove packages on VM guests ------------------------------------- 5.39s
resolv : stop NetworkManager changing resolv.conf ----------------------- 5.25s
yumrepo : epel6 gpg key ------------------------------------------------- 3.94s
yumrepo : epel7 gpg key ------------------------------------------------- 3.71s
yumrepo : nsg gpg key --------------------------------------------------- 3.57s
resolv : build resolv.conf ---------------------------------------------- 3.30s
yumrepo : nsg repo ------------------------------------------------------ 2.66s
resolv : check NetworkManager running ----------------------------------- 2.63s
yumrepo : psp repo ------------------------------------------------------ 2.62s
yumrepo : ucs repo ------------------------------------------------------ 2.44s
yumrepo : epel repo ----------------------------------------------------- 2.27s
resolv : check for nmcli ------------------------------------------------ 2.08s
core : remove various unwanted files ------------------------------------ 1.42s
telegraf : write telegraf.conf file ------------------------------------- 1.13s
core : copy sudoers in place -------------------------------------------- 0.94s
core : ensure sshd is running ------------------------------------------- 0.90s

4
でプロファイリングを行いANSIBLE_CALLBACK_WHITELIST=profile_tasks、でより徹底的なデバッグを行いANSIBLE_DEBUG=1ます。また、初期のssh接続速度で細心の注意を払ってください。
コンスタンチンス

@KonstantinSuvorovのコメントに同意してください。特定のタスクにかなりの時間を費やしている多くのホストが存在する可能性があります。profile_tasksを使用してタスクを分離すると、ホスト上でそれらのタスクのみを実行し、最も長いタスクを確認できます。また、すべてのホストに対して「command:w」のような簡単なタスクを実行して、予想される時間がかかることを確認できます。
-andyhky

1
エントロピーの枯渇を確認します。watch cat /proc/sys/kernel/random/entropy_availプレイブックの実行中。1000未満の場合、潜在的な問題があります。64未満で回復しない場合、明確なエントロピー飢starの問題があります。(一部のVM環境で一般的)。これは、管理サーバーと、管理しているノードにも適用されます。
キャメロンカー

4GB RAMの管理VMでは、forks = 20およびpipelining = Trueです。ansible -i all all -m ping300を超えるホスト(主にVM)に対して1分もかかりませんでした。あなたのプレイブックはユーザーを変更するために何でもしますか(/ sudo /などになります)。「-m ping」はどのように機能しますか?経験に基づいて、50のフォークに対してより多くのメモリが必要だと言います。
キャメロンカー

ターゲットオペレーティングシステムは何ですか?
xddsg

回答:


1

あなたのansible.cfgセットには次のものがあります:

[defaults]

# profile each task
callback_whitelist = profile_tasks

# [don't validate host keys](http://docs.ansible.com/ansible/intro_configuration.html#host-key-checking)
host_key_checking = False

[ssh_connection]
pipelining = True

また、プレイブックで、戦略を「無料」に設定します

- hosts: all
  strategy: free
  tasks: [...]

最後に、プレイでのファクトギャザリングを無効にします。 gather_facts: false

プロファイリング後に、次の多くが表示されている場合:

TASK [pip foo]
ok: [10.192.197.252] => (item=ansible)
ok: [10.192.197.252] => (item=boto)
ok: [10.192.197.252] => (item=boto3)
ok: [10.192.197.252] => (item=passlib)
ok: [10.192.197.252] => (item=cryptography)

ansible.cfg[デフォルト]でこれらのアクションを押しつぶします。

例えば squash_actions = yum,pip,bar


返信いただきありがとうございます。私たちはすでにストラテジーを使用しています。無料で事実を収集することは、プレイブックに必要なものだと思うので、実際には機能しません。私の答えで述べたように、私はすでにパイプライン処理を行っています。
user53814

プロファイリングをオンにした@ user53814、最も時間がかかっているのは何ですか?使用しているansibleのバージョンで質問を更新できますか?
-xddsg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.