我使用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的选择
答案 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}