nginx work 绑定 cpu 24 核的

2015-12-02 02:13:53 +08:00
 zzlyzq
搞了一个脚本,因为系统负载过高,听得高人意见,把 work 跟 cpu 核绑定起来,但是 24 个这东西,该咋写来,搞了一个脚本

#!/bin/env python

import os,sys,re

print "worker_cpu_affinity",
length = 24
for i in range(1,length+1):
result=[]
num0 = length - 1 - i
num2 = i
for a in range(0,num0+1):
result.append("0")
result.append("1")
for b in range(0,num2-1):
result.append("0")
#print result
print ''.join(result),
print ";"

worker_cpu_affinity 000000000000000000000001 000000000000000000000010 000000000000000000000100 000000000000000000001000 000000000000000000010000 000000000000000000100000 000000000000000001000000 000000000000000010000000 000000000000000100000000 000000000000001000000000 000000000000010000000000 000000000000100000000000 000000000001000000000000 000000000010000000000000 000000000100000000000000 000000001000000000000000 000000010000000000000000 000000100000000000000000 000001000000000000000000 000010000000000000000000 000100000000000000000000 001000000000000000000000 010000000000000000000000 100000000000000000000000 ;

大家有何高见来~ 请教一下~
4604 次点击
所在节点    Python
14 条回复
msg7086
2015-12-02 04:42:36 +08:00
小学知识,数字前面的零可以省略。
所以 24 核的话拿 ruby 跑可以这样写:
24.times.map{|i| '1'+'0'*i}.join(' ')

顺便 python 里也可以用 '0'*i 这种写法,没必要开 for 循环。
lhbc
2015-12-02 06:00:08 +08:00
直接 auto 就行了, nginx 自己会处理,除非你用的是多年前的版本。
Andy1999
2015-12-02 08:06:38 +08:00
nginx 不是会动态分配 CPU 核心数吗。。。
不过我 128 核貌似一直分不到 3 核
zzlyzq
2015-12-02 08:27:42 +08:00
@msg7086 乘法不错 当时没想起来
zzlyzq
2015-12-02 08:28:09 +08:00
@lhbc 就是为了防止 auto 带来的性能损失
msg7086
2015-12-02 08:51:13 +08:00
@lhbc
@Andy1999
看了一下 1.9.6 的源码没看到支援。
lerry
2015-12-02 10:03:19 +08:00
http://tengine.taobao.org/
这个支持 自动根据 CPU 数目设置进程个数和绑定 CPU 亲缘性
dreampuf
2015-12-02 10:17:48 +08:00
In [1]: for i in xrange(0, 24):
print "{0:024b}".format(1<<i)
....:
000000000000000000000001
000000000000000000000010
000000000000000000000100
000000000000000000001000
000000000000000000010000
000000000000000000100000
000000000000000001000000
000000000000000010000000
000000000000000100000000
000000000000001000000000
000000000000010000000000
000000000000100000000000
000000000001000000000000
000000000010000000000000
000000000100000000000000
000000001000000000000000
000000010000000000000000
000000100000000000000000
000001000000000000000000
000010000000000000000000
000100000000000000000000
001000000000000000000000
010000000000000000000000
100000000000000000000000
msg7086
2015-12-02 11:14:31 +08:00
@lerry tengine 在 nginx 改动太大,不太敢用……
自动 Affinity 倒是实现了,感觉可以 back port 回去(?
lerry
2015-12-02 11:20:17 +08:00
@msg7086 没什么不敢用的,配置都兼容, 我一直在用
lhbc
2015-12-02 11:59:47 +08:00
ryd994
2015-12-02 12:44:28 +08:00
我不相信你有能让 nginx 占满核的吞吐量
affinity 打破了操作系统的 scheduling ,除非你有明确了解 affinity 的意义(而不是“高人指点”),否则你应该首先考虑这些选项:

纯静态开 sendfile
大量新连接关 accept_mutex 开 multiaccept
降低 gziplevel ,因为即使 level1 也有近半的压缩率,而计算量可以减少好几倍
用正则开 pcre_jit
适当增加系统的 send buffer
ssl session cache 或者硬件加速

即使开 affinity , 24 个 worker 各自绑定 1 个 cpu 也不是个好主意。很多系统上 cpu0 地位特殊,必须处理一些硬件中断,因此用户可用的性能不如其他 CPU 。 affinity 主要是希望减少上下文切换,增加缓存命中,上面的选项基本足够。如果你有其他服务,特别是后端也在跑,那 nginx 就更不该使用所有的 cpu ,而应该尽量占满其中几个,同时把其他服务集中在其他 cpu 上。
lhbc
2015-12-02 12:48:29 +08:00
@ryd994 赞同
24 核的 CPU ,如果单纯跑 nginx+静态,配置没有问题的话(不加一堆 if 之类的 dirty 的东西), 40G 带宽都能跑满吧
负载高的原因应该不是 nginx
zzlyzq
2015-12-03 03:07:47 +08:00
@lhbc 负载高因为 nginx 的日志落盘,目前我发现的是这个原因。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/240453

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX