Hiệu suất hợp lý cho một vở kịch Ansible đơn giản so với ~ 100 máy chủ là gì?


11

Chúng tôi đang bắt đầu xem xét Ansible để thay thế một bản cài đặt cfengine2 cũ. Tôi có một cuốn sách đơn giản rằng:

  • sao chép một tập tin sudoers
  • sao chép một tệp độ phân giải templated (được cung cấp với dữ liệu nhóm và dữ liệu lưu trữ)
  • kiểm tra một vài dịch vụ đang chạy
  • kiểm tra sự hiện diện của người dùng cục bộ

Playbook mất hơn 4 phút thời gian để chạy trên 97 máy (tất cả được kết nối qua mạng 1gig hoặc 10gig nhanh, với độ trễ LAN dưới 1ms) và tiêu thụ hơn 50% CPU trên máy ảo 4G 2 nhân khi tôi chạy nó

Mất khoảng 11 giây để chạy với một máy duy nhất, với khoảng 4 giây thời gian sử dụng CPU của người dùng + sys, mà TBH vẫn có vẻ hơi quá so với số lượng công việc liên quan.

Các bit rõ ràng:

  • Tôi đã kích hoạt đường ống một cách rõ ràng trong một plays-dir cục bộ ansible.cfg
  • Tôi có bộ nhớ đệm thực tế để jsonfile được bật, cùng một địa phương ansible.cfg
  • Tôi có các dĩa được đặt thành 50, tương tự (Tôi đã thử các giá trị khác)
  • Tôi chắc chắn rằng Ansible đang sử dụng SSH chứ không phải Paramiko và nó đang sử dụng ổ cắm điều khiển liên tục - Tôi có thể thấy các quy trình SSH đang được bắt đầu và duy trì trong suốt quá trình chạy.

Mức hiệu suất này có bình thường không hoặc có gì sai với thiết lập của tôi? Làm thế nào tôi có thể đi về việc xác định những gì, nếu vậy?

Chỉnh sửa: Kể từ tháng 8 năm 2017, chúng tôi vẫn thấy vấn đề này. Phiên bản Ansible là 2.2.1 và kích thước playbook đã tăng lên. Số cập nhật:

  • 98 máy chủ
  • ansible -m ping all mất 4,6 giây thực, 3,2 giây người dùng, 2,5 giây sys lần
  • một lần chạy toàn bộ Playbook mất 4 phút, sử dụng 100% người dùng và ~ 35% CPU hệ thống trong khi thực hiện (trên máy chủ triển khai VM 2 lõi, 100% là một CPU đầy đủ)
  • HĐH mục tiêu phần lớn là CentOS 7, một số CentOS 6
  • hồ sơ không tiết lộ bất kỳ điểm nóng nhiệm vụ cụ thể AFAICT

Mặc dù playbook bây giờ lớn hơn nhiều, tôi vẫn không nghĩ có gì ở đó để biện minh cho mức tải CPU đó trên máy chủ playbook - có lẽ là thời gian, nhưng máy chủ triển khai sẽ không hoạt động trong hầu hết thời gian chạy, theo như tôi có thể thấy, chủ yếu là các bản sao tệp và một số bản mở rộng mẫu.

Lưu ý rằng chúng tôi đang sử dụng khá nhiều máy chủ / nhóm

Một số người đã hỏi về hồ sơ, đuôi của một cuộc chạy với hồ sơ:

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
Tạo một số hồ sơ với ANSIBLE_CALLBACK_WHITELIST=profile_tasksvà để gỡ lỗi kỹ lưỡng hơn với ANSIBLE_DEBUG=1. Cũng chú ý ở tốc độ kết nối ssh ban đầu.
Konstantin Suvorov

Đồng ý với nhận xét của @KonstantinSuvorov - có thể có một máy chủ duy nhất trong lô đang mất nhiều thời gian cho một nhiệm vụ nhất định. Khi bạn tách biệt tác vụ với profile_t Nhiệm vụ, bạn có thể kiểm tra chỉ chạy các tác vụ đó trên máy chủ của mình và xem tác vụ nào dài nhất. Bạn cũng có thể chạy một tác vụ tầm thường, như "lệnh: w" đối với tất cả các máy chủ để thấy rằng nó cần một khoảng thời gian dự kiến.
andyhky

1
Kiểm tra đói entropy. watch cat /proc/sys/kernel/random/entropy_availtrong khi playbook đang chạy Nếu ít hơn 1000, bạn có một vấn đề tiềm ẩn; nếu nó ít hơn 64 và không phục hồi, thì bạn có vấn đề chết đói entropy xác định. (phổ biến trong một số môi trường VM). Điều này áp dụng cho máy chủ quản lý của bạn và cả các nút bạn đang quản lý.
Cameron Kerr

Trên máy ảo quản lý của tôi có RAM 4GB, tôi có forks = 20 và pipelining = True. ansible -i all all -m pingchống lại hơn 300 máy chủ (chủ yếu là VM) mất chưa đến 1 phút. Playbook của bạn có làm gì để thay đổi người dùng không (trở thành / sudo / v.v.). '-M ping' hoạt động như thế nào? Tôi sẽ, dựa trên kinh nghiệm, nói rằng bạn muốn có thêm bộ nhớ cho 50 dĩa.
Cameron Kerr

hệ điều hành mục tiêu của bạn là gì?
xddsg

Câu trả lời:


1

trong ansible.cfgtập hợp của bạn như sau:

[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

Ngoài ra, trong Playbook của bạn, hãy đặt chiến lược là 'miễn phí'

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

Cuối cùng, vô hiệu hóa thu thập thực tế trong trò chơi của bạn: gather_facts: false

Nếu, sau khi định hình, bạn đang thấy rất nhiều điều này:

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)

đè bẹp những hành động đó trong ansible.cfg[mặc định]:

ví dụ squash_actions = yum,pip,bar


Cảm ơn vi đa trả lơi. Chúng tôi đã sử dụng chiến lược: thu thập miễn phí và thực tế Tôi sợ là điều mà các cuốn sách yêu cầu, vì vậy điều đó không thực sự hiệu quả. Như đã lưu ý trong câu trả lời của tôi, tôi đã thực hiện pipelining.
dùng53814

@ user53814 với hồ sơ được bật, cái gì mất nhiều thời gian nhất? bạn có thể cập nhật câu hỏi của bạn với phiên bản ansible bạn đang sử dụng không?
xddsg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.