代码之家  ›  专栏  ›  技术社区  ›  wangshimeng

如何在ansible playbook性能调整中减少{time.sleep}时间

  •  -2
  • wangshimeng  · 技术社区  · 7 年前

    我正在使用以下剧本调整ansible剧本的性能

    ---
    # simplespeedtest.yml
    - hosts: localhost
      connection: local
      gather_facts: false
      tasks:
        - command: echo 1
        - command: echo 2
        - command: echo 30
    

    我使用tasts\U profile模块测试了playbook的运行时间和playbook中的每个任务,结果如下:

    # time $ANSIBLE_HOME/bin/ansible-playbook -i hosts simplespeed_localhost.yml
    
    PLAY [localhost] ********************************************************************************
    TASK [command] ********************************************************************************
    Thursday 11 January 2018  15:29:45 +0800 (0:00:00.091)       0:00:00.091 ****** 
    changed: [localhost]
    
    TASK [command] ********************************************************************************
    Thursday 11 January 2018  15:29:45 +0800 (0:00:00.316)       0:00:00.407 ****** 
    changed: [localhost]
    
    TASK [command] ********************************************************************************
    Thursday 11 January 2018  15:29:46 +0800 (0:00:00.205)       0:00:00.613 ****** 
    changed: [localhost]
    
    PLAY RECAP ********************************************************************************
    localhost                  : ok=3    changed=3    unreachable=0    failed=0   
    
    Thursday 11 January 2018  15:29:46 +0800 (0:00:00.187)       0:00:00.800 ****** 
    =============================================================================== 
    command ---------------------------------- 0.32s
    command ----------------------------------- 0.21s
    command ----------------------------------- 0.19s
    Playbook run took 0 days, 0 hours, 0 minutes, 0 seconds
    
    real    0m1.894s
    user    0m1.652s
    sys 0m0.220s
    

    执行任务的总时间是0.72s,但执行剧本的总时间是1.894s,这比任务的总时间要大,我想知道如何减少这个时间。通过运行以下命令:

    time python -m cProfile -o test1.out -s time $ANSIBLE_HOME/bin/ansible-playbook -i hosts simplespeed_localhost.yml
    

    我得到了python cprofile文件

     ncalls  tottime  percall  cumtime  percall filename:lineno(function)
          633    0.673    0.001    0.673    0.001 {time.sleep}
        34730    0.072    0.000    0.076    0.000 /usr/local/lib/python2.7/dist-packages/yaml/reader.py:99(forward)
         3597    0.069    0.000    0.213    0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:1272(scan_plain)
        63467    0.058    0.000    0.128    0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:142(need_more_tokens)
        38543    0.051    0.000    0.585    0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:113(check_token)
        66812    0.046    0.000    0.055    0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:276(stale_possible_simple_keys)
          153    0.042    0.000    0.093    0.001 /usr/lib/python2.7/ConfigParser.py:464(_read)
           46    0.040    0.001    0.040    0.001 {compile}
       162917    0.039    0.000    0.040    0.000 /usr/local/lib/python2.7/dist-packages/yaml/reader.py:87(peek)
        22624    0.032    0.000    0.032    0.000 /usr/local/lib/python2.7/dist-packages/yaml/error.py:6(__init__)
         4981    0.031    0.000    0.150    0.000 /usr/local/lib/python2.7/dist-packages/yaml/parser.py:273(parse_node)
      967/207    0.030    0.000    0.089    0.000 /usr/lib/python2.7/sre_parse.py:379(_parse)
         7649    0.028    0.000    0.428    0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:153(fetch_more_tokens)
          101    0.026    0.000    0.026    0.000 {method 'read' of 'file' objects}
        22624    0.026    0.000    0.058    0.000 /usr/local/lib/python2.7/dist-packages/yaml/reader.py:114(get_mark)
       100506    0.025    0.000    0.029    0.000 {isinstance}
    

    {time.sleep}time的调用是0.673s,我想知道ansible的哪个进程将调用{time.sleep},以及如何减少它

    ps: 我从中的ansible源代码中得到了3个位置调用{time.sleep}/lib/ansible/executor/task\u executor。py并更改arg,但似乎不起作用

    1 回复  |  直到 7 年前
        1
  •  0
  •   augurar    7 年前

    你需要更仔细地考虑你要完成的任务。一个简单的剧本,有着琐碎的任务,没有SSH连接,并不能代表现实生活中ansible剧本的实际性能,因此您可能得到的任何分析结果都是毫无意义的。

    此外,Ansible的任务在目标机器上远程执行(或对于本地任务,在子进程中执行)。这意味着概要文件将无法测量正在执行的实际模块代码。所以只要跑 ansible-playbook 通过探查器并不能显示完整的故事。

    话虽如此,让我们试着从探查器中获取更多信息。您可以使用从概要文件输出生成调用图 gprof2dot ,详见 here . 图形将根据每个函数所用的时间进行着色。

    这是我在电脑上运行剧本时的图形。根据系统的性能特点,它可能会有所不同:

    profiler call graph

    看看图表,我们可以看到 time.sleep() 正在从调用 ansible.plugins.strategy.__init__.py 单元我们可以从代码中看到,睡眠发生在ansible等待任务完成时。您可以在中更改轮询间隔 configuration file ,但默认值为0.001秒,这已经相当快了。改变这一点不太可能产生重大影响。

    总结如下:

    • 您需要更现实的行动手册来进行有效的基准测试
    • 由于远程任务执行,探查器数据受到限制
    • 改变睡眠时间间隔不会显著提高性能

    以下是Ansible团队提出的一些与绩效相关的建议,可能会有所帮助: