使用xargs并将远程服务器的CPU负载保持在最低

时间:2018-01-30 05:24:13

标签: python multithreading bash openstack xargs

我使用xargs进行并行处理。这个帖子跟我所拥有的一样。 Parallel processing with xargs in bash 但并行处理增加了CPU负载。我正在运行57个openstack租户的脚本来从中获取结果。此报告每2小时运行一次,导致CPU峰值。

为了减轻负荷,我想添加随机睡眠时间......如下所示,但它并没有提供太多帮助。我不确定是否可以使用NICE来设置优先级,因为我提取的结果来自openstack服务器。如果有可能,请告诉我。

我可以删除并行处理,但这需要6个小时才能获得租户的所有报告。所以这不是一个选择。

如果还有其他方法可以优化这一点......任何想法或建议都会很棒。

source ../creds/base
printf '%s\n' A B C D E F G H I J K L M N O P |

xargs -n 3 -P 8 bash -c 'for tenant; do
      source ../creds/"$tenant"
      python ../tools/openstack_resource_list.py "$tenant"> ./reports/openstack_reports/"$tenant".html
      sleep $[ ( $RANDOM % 10 )  + 1 ]s
done' _

Python文件

with open('../floating_list/testReports/'+tenant_file+'.csv', 'wb') as myfile:
    fields = ['Name', 'Volume', 'Flavor', 'Image', 'Floating IP']
    writer = csv.writer(myfile)
    writer.writerow(fields)
    try:
        for i in servers:
            import io, json
            with open('../floating_list/testReports/'+tenant_file+'.json', 'w') as e:
                e.write(check_output(['openstack', 'server', 'show', i.name, '-f', 'json']))
            with open('../floating_list/testReports/'+tenant_file+'.json', 'r') as a:
                data = json.load(a)
                name.append(i.name)
                volume = data.get('os-extended-volumes:volumes_attached', None) 
                if volume:
                    vol = [d.get('id', {}) for d in volume if volume]
                    vol_name_perm = []
                    for i in vol:
                        try:
                            vol_name1 = (check_output(['openstack', 'volume', 'show', i,  '-c', 'name', '-f', 'value'])).rstrip()
                            vol_name_perm.append(vol_name1)
                        except:
                            vol_name_perm.append('Error')
                    vol_join = ','.join(vol_name_perm)
                    vol_name.append(vol_join)
                else:
                    vol_name.append('None')
                ...

        zipped = [(name), (vol_name),(flavor),(image),(addr)]
        result = zip(*zipped)
        for i in result:
            wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
            wr.writerow(i)
    except (CalledProcessError, IndexError) as e:
        print (e)
        print("except", i.name)

使用GNU PARALLEL

printf '%s\n' A B C D E F | parallel --eta -j 2 --load 40% --noswap 'for tenant; do
      source ../creds/"$tenant"
      python ../tools/openstack_resource_list.py "$tenant"> ./reports/openstack_reports/"$tenant".html
done'

我在意外的令牌“A'

附近出现语法错误

解决方法

我现在可以使用xargs -n 1 -p 3来管理负载。这给了我2个小时内的报告。我仍然希望按照Ole Tange的建议探索我对GNU Parallel的选择

1 个答案:

答案 0 :(得分:0)

也许你可以使用GNU Parallel和niceload(GNU Parallel的一部分):

niceload parallel --nice 11 --bar "'source ../creds/{};
  python ../tools/openstack_resource_list.py {} > ./reports/openstack_reports/{}.html'" ::: {A..F}