V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kenneth
V2EX  ›  PHP

Nginx+php-fpm无法支撑大流量的并发访问?

  •  
  •   kenneth · 2013-07-05 11:08:57 +08:00 · 16252 次点击
    这是一个创建于 4146 天前的主题,其中的信息可能已经有所发展或是发生改变。
    统计服务器,无法支撑大流量的并发访问,导致php统计程序无法运行。

    现在加大pm.max_children可以访问一会,但是php-fpm进程会越来越多,直到内存耗尽。

    求解决思路。

    Nginx错误日志

    connect() failed (110: Connection timed out) while connecting to upstream

    php-fpm日志

    [05-Jul-2013 02:07:14] NOTICE: [pool www] child 1389 exited with code 0 after 31650.855799 seconds from start
    [05-Jul-2013 02:07:14] NOTICE: [pool www] child 1778 started
    [05-Jul-2013 02:08:53] NOTICE: [pool www] child 1382 exited with code 0 after 31750.211689 seconds from start
    [05-Jul-2013 02:08:53] NOTICE: [pool www] child 1779 started
    [05-Jul-2013 02:10:33] NOTICE: [pool www] child 1394 exited with code 0 after 31849.875417 seconds from start
    [05-Jul-2013 02:10:33] NOTICE: [pool www] child 1794 started
    [05-Jul-2013 02:26:55] NOTICE: [pool www] child 1391 exited with code 0 after 32831.675556 seconds from start
    [05-Jul-2013 02:26:55] NOTICE: [pool www] child 1799 started
    [05-Jul-2013 02:58:17] NOTICE: [pool www] child 1372 exited with code 0 after 34714.447165 seconds from start
    [05-Jul-2013 02:58:17] NOTICE: [pool www] child 1815 started
    25 条回复    2014-07-07 10:37:25 +08:00
    skydiver
        1
    skydiver  
       2013-07-05 11:10:56 +08:00
    多少个并发啊
    itopidea
        2
    itopidea  
       2013-07-05 11:17:15 +08:00
    我也遇到这个问题,以前55个并发,耗尽1G内存。
    akira
        3
    akira  
       2013-07-05 11:20:44 +08:00
    你这是多大规模啊
    darkyoung
        4
    darkyoung  
       2013-07-05 11:23:39 +08:00
    做负载均衡吧
    RobinFai
        5
    RobinFai  
       2013-07-05 11:45:13 +08:00
    Nginx+php-fpm支撑不起的时候, apache+php也差不多了。
    换大内存服务器。改变策略,增加服务器做负载均衡。
    soli
        6
    soli  
       2013-07-05 11:47:34 +08:00
    55 个并发太少了吧。

    是不是达到带宽上限了?也就是瓶颈不在PHP这,而是在带宽?
    scourgen
        7
    scourgen  
       2013-07-05 12:00:38 +08:00
    无法运行的原因是什么?内存不够?进程死循环??在没有更多服务器现场数据的情况下,现在只能怀疑是你的程序有问题。

    FPM只是一个跑php的载体,如果你的程序有问题,再调整FPM也是没用的。

    所以strace一个进程,先看看程序到底在做什么吧
    pubby
        8
    pubby  
       2013-07-05 12:17:35 +08:00
    一味调大进程数最终只会导致整体性能下降

    优化程序,请求处理越快越好。

    找到瓶颈,如果瓶颈在php本身,那么考虑其它的高并发方案,比如用node.js 或者 golang重写。

    如果一台机器达到上限,那就增加机器分流。

    ps. 统计这玩意我都是node.js做的,直接写文件,然后后台脚本定时处理日志文件。
    GTim
        9
    GTim  
       2013-07-05 12:21:51 +08:00
    不是吧...这年头还有php-fpm把内存耗尽的...不过没关系...如果可以,做负载均衡把。没条件,把一些可以缓存的东西,先在客户端缓存起来...把一些耗时耗力的部分用纯php改写..还不行,上hidhop...杂七杂八的各种优化方法...

    php-fpm进程数最好是根据内存和cpu来设置的..
    BOYPT
        10
    BOYPT  
       2013-07-05 12:30:09 +08:00
    进程越来越多说明你的php程序太慢,处理不过来。fpm也好apache也好,对慢代码都只有开进程。
    qsun
        11
    qsun  
       2013-07-05 12:45:33 +08:00
    统计服务器 就不要挂php好了,直接/dev/null 然后做 offline 分析
    ipconfiger
        12
    ipconfiger  
       2013-07-05 13:05:45 +08:00
    1G内存玩什么高并发
    lqs
        13
    lqs  
       2013-07-05 14:01:42 +08:00
    『统计服务器,无法支撑大流量的并发访问,导致php统计程序无法运行。』
    这句最重要的描述却一笔带过,什么叫『无法支撑』和『无法运行』?

    『现在加大pm.max_children可以访问一会』
    然后走向了一条错误的道路。
    sarices
        14
    sarices  
       2013-07-05 14:04:59 +08:00
    低内存最好限制一下php-fpm的进程数量
    kenneth
        15
    kenneth  
    OP
       2013-07-05 18:11:22 +08:00
    我这样尝试的:
    1.限制php-fpm进程数量
    结果:connect() failed (110: Connection timed out) while connecting to upstream
    2.我增加pm.max_children
    结果:php-fpm进程不断增加,直到内存没有。

    总是网站无法正常访问。

    还是不知道如何解决。
    ovear
        16
    ovear  
       2013-07-05 19:52:50 +08:00
    别用lnmp用lanmp,php用apache来跑,这是cgi的通病。大压力下,掉包率很离谱
    ovear
        17
    ovear  
       2013-07-05 19:53:38 +08:00
    这就是所谓的nginx高并发下502的原因。。
    felix021
        18
    felix021  
       2013-07-06 00:27:48 +08:00
    55个并发不至于就给跑死了吧。
    APC/eAccelerater/XCache之一装了没?
    XDEBUG装了没?看看性能热点是在什么地方。
    如果热点是数据库,数据库slowlog看了没,查询都走索引了吗,用memcache/redis做缓存了吗?
    lightforce
        19
    lightforce  
       2013-07-06 00:31:02 +08:00
    pm= static or dynamic ?
    likuku
        20
    likuku  
       2013-07-06 13:03:51 +08:00
    统计的任务要作队列,用户提交统计任务=>丢队列,返回让用户等着去,后面统计程序从队列领任务去跑,跑完返回结果。

    统计这种要实时返回,数据量大/算法复杂,都不现实。
    hitsmaxft
        21
    hitsmaxft  
       2013-07-06 17:22:49 +08:00
    你的这种情况, 我最近也遇到, fpm没有可用进程, 不断启用新的进程, 但是新进行往往都没有提供服务. 最后到达最大子进程数, 而能够正常服务的进程又到达访问次数上限, 最后所有fpm下挂载的进程都不可用.

    结果就是 nginx 连不上 fpm, fpm挂着一堆不可用的进程.

    不过我还没定位到故障原因, 临时解决方案就是重启fpm
    msg7086
        22
    msg7086  
       2013-07-06 19:37:06 +08:00
    我以前在一台VPS上试跑过统计服务。nginx+php-fpm大概可以承受150req/s。

    后来改用离线处理法,把nginx的access log写入文件里,用cron每分钟mv + kill -USR + 分析日志文件后更新memcache里的数据,然后nginx直接relay到memcache里取数据返回。

    这种架构可以轻松撑起500req+/s的访问。

    双核256M内存VPS实测。
    kenneth
        23
    kenneth  
    OP
       2013-07-06 19:50:02 +08:00   ❤️ 1
    @hitsmaxft 你描述的很清晰,我们遇到了一样的问题。目前我也没有解决,但是会一一尝试大家都建议。
    hitsmaxft
        24
    hitsmaxft  
       2013-07-06 20:18:00 +08:00
    @kenneth 我看大伙的说法都是觉得phpfpm服务能力达不到当前并发的水平.

    但是我感觉问题的关键并不是php业务的性能问题. 因为发生问题的时间都在深夜流量低谷, 而不是流量高峰.
    tonlmy
        25
    tonlmy  
       2014-07-07 10:37:25 +08:00
    目前也遇到这种情况,strace 进程 一直超时
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2638 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:09 · PVG 12:09 · LAX 20:09 · JFK 23:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.