V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zzlyzq
V2EX  ›  Python

nginx work 绑定 cpu 24 核的

  •  
  •   zzlyzq · 2015-12-02 02:13:53 +08:00 · 4521 次点击
    这是一个创建于 3066 天前的主题,其中的信息可能已经有所发展或是发生改变。
    搞了一个脚本,因为系统负载过高,听得高人意见,把 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 ;

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

    顺便 python 里也可以用 '0'*i 这种写法,没必要开 for 循环。
    lhbc
        2
    lhbc  
       2015-12-02 06:00:08 +08:00 via Android
    直接 auto 就行了, nginx 自己会处理,除非你用的是多年前的版本。
    Andy1999
        3
    Andy1999  
       2015-12-02 08:06:38 +08:00 via iPhone
    nginx 不是会动态分配 CPU 核心数吗。。。
    不过我 128 核貌似一直分不到 3 核
    zzlyzq
        4
    zzlyzq  
    OP
       2015-12-02 08:27:42 +08:00 via Android
    @msg7086 乘法不错 当时没想起来
    zzlyzq
        5
    zzlyzq  
    OP
       2015-12-02 08:28:09 +08:00 via Android
    @lhbc 就是为了防止 auto 带来的性能损失
    msg7086
        6
    msg7086  
       2015-12-02 08:51:13 +08:00
    @lhbc
    @Andy1999
    看了一下 1.9.6 的源码没看到支援。
    lerry
        7
    lerry  
       2015-12-02 10:03:19 +08:00
    http://tengine.taobao.org/
    这个支持 自动根据 CPU 数目设置进程个数和绑定 CPU 亲缘性
    dreampuf
        8
    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
        9
    msg7086  
       2015-12-02 11:14:31 +08:00
    @lerry tengine 在 nginx 改动太大,不太敢用……
    自动 Affinity 倒是实现了,感觉可以 back port 回去(?
    lerry
        10
    lerry  
       2015-12-02 11:20:17 +08:00
    @msg7086 没什么不敢用的,配置都兼容, 我一直在用
    lhbc
        11
    lhbc  
       2015-12-02 11:59:47 +08:00
    ryd994
        12
    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
        13
    lhbc  
       2015-12-02 12:48:29 +08:00
    @ryd994 赞同
    24 核的 CPU ,如果单纯跑 nginx+静态,配置没有问题的话(不加一堆 if 之类的 dirty 的东西), 40G 带宽都能跑满吧
    负载高的原因应该不是 nginx
    zzlyzq
        14
    zzlyzq  
    OP
       2015-12-03 03:07:47 +08:00
    @lhbc 负载高因为 nginx 的日志落盘,目前我发现的是这个原因。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5260 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:46 · PVG 16:46 · LAX 01:46 · JFK 04:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.