跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 高并发, PHP 请求超时, CPU 占用上不去
未分類
4 9 月 2020

高并发, PHP 请求超时, CPU 占用上不去

高并发, PHP 请求超时, CPU 占用上不去

資深大佬 : xiaoshouchen 5

服务器是阿里云的 8 核 8G
当有稍微高一点的并发时,PHP 就会超时 504 或者 502,然后 CPU 占用率在 30 %左右上不去
PHP 用的 Docker + Alpine-fpm 7.2

pm=static
pm.max_children=16

我尝试把 max_children 提高,CPU 占用率还是低

大佬有話說 (27)

  • 資深大佬 : opengps

    你的问题不一定是配置问题,更像是单个站点下的某些资源占用较大成为瓶颈点了
    思路一:找出来代码操作资源使用的瓶颈点,代码优化,提高单站点负载能力
    思路二:如果不从优化资源占用代码角度讲的话,适合用多个站点来“负载均衡”

  • 資深大佬 : ben1024

    排查下有没有 磁盘 IO 或者 DB 操作限制

  • 資深大佬 : qq1340691923

    代码问题

  • 資深大佬 : owenliang

    空接口能跑上去,那就不是 PHP 配置问题了。

  • 資深大佬 : wakzz

    1. 输出红火图,查看应用 CPU 时间分片占用分布

  • 資深大佬 : Aliencn

    pm.max_children=16
    这个值太小了吧。

  • 資深大佬 : wakzz

    2. 执行命令`dstat 1`,监控一下压测期间服务器的 CPU,IO,网络,中断的数据情况

  • 資深大佬 : keepeye

    php-fpm 进程数量太低了,加到 256

    你这个大概率是 io 瓶颈,跟 cpu 没啥关系,检查下你的代码吧,是否有远程调用或者数据库是否慢查询了。

  • 主 資深大佬 : xiaoshouchen

    @Aliencn 请问大概多大的比较合适,我曾经请教过别人,别人给我的回复时,CPU 切换本身也是消耗资源的,CPU 本身的限制在那,过多的提高 max_children 没有效果,反而有副作用( CPU 切换消耗资源)。

  • 資深大佬 : sagaxu

    @xiaoshouchen 瞎 jb 扯,fpm 先加到 100 再说

  • 資深大佬 : zibber

    8g 内存,把每个进程占用内存调小, max_children 调到 500 没问题

  • 主 資深大佬 : xiaoshouchen

    @keepeye 数据库用的阿里云的 RDS,没有查到慢查询的记录,而且 CPU 和内存的占用率也很低。除了微信分享、登录之外,基本上没有第三方的请求。磁盘 IO 占用率也不高买的是 IO 优化版的服务器。php-fpm 进程开太多,会不会导致 CPU 切换时间片本身消耗 CPU 资源。

  • 主 資深大佬 : xiaoshouchen

    @sagaxu 可否详细说明一下,FPM 进程数和配置的关系,”进程数过多,CPU 时间片切换消耗资源“这个说法的错误之处在什么地方呢?

  • 資深大佬 : janxin

    @xiaoshouchen 你现在 CPU 的占用很低,没有到 max_children 敏感的阶段。还是需要加大的。其他的要看周边的数据影响,比如是否 DB 拖慢 etc

  • 資深大佬 : zpfhbyx

    贴下 fpm 配置?

  • 資深大佬 : GM

    别听上面的人瞎扯,fpm 进程数量没必要太大的,50 个已经非常大了。
    每个 fpm 进程都要单独消耗一份内存,假设每个 50M 内存,100 个进程那就是 5G 内存,256 个那就是 12.5G 内存,别的程序还跑不跑了?

  • 資深大佬 : keepeye

    @GM 进程数量是动态的,max 只是一个理论最大值而已,而且也不是每个进程都一直占用 30M 内存不释放的

  • 資深大佬 : keepeye

    具体定个什么值还是要靠实际压测,总比一开始小气吧啦的好,爆内存了再说

  • 資深大佬 : GM

    @keepeye pm=static 的时候就不是动态了

  • 資深大佬 : GM

    @keepeye
    至于每个进程占多少,这个不好说,要看是什么框架,也要看具体业务代码怎么写。
    而且,框架本身也要占不少内存,如果是轻量级框架还好,占得少点,如果是 Laravel 之类重量级框架,那预留 50M 很正常的。

  • 資深大佬 : buliugu

    建议上火焰图看看,凭空 profiling 都是扯淡

  • 資深大佬 : brader

    16 核 16G
    pm=static
    pm.max_children=400
    3 万多个用户

  • 資深大佬 : brader

    服务已经稳定跑了 1 年了。

  • 主 資深大佬 : xiaoshouchen

    @buliugu 抱歉,不太清楚火焰图是什么,如何查看,可否指教?

  • 資深大佬 : wangritian

    fpm 是多进程单线程的吧,你的业务代码应该是有高耗时 IO,导致 16 个 fpm 进程全被阻塞,新请求进不来,不改架构的优化方法:
    磁盘 IO:开启 opcache 缓存,尤其是各种框架一堆 php 文件的,别每个请求都挨个读一遍;如果业务有处理大量小文件的,看能不能合并一个大文件
    网络 IO:mysql/redis 机器放本机或局域网,索引优化好,text 字段没用到别查;第三方功能 api 换延迟低的
    但治标不治本,进程模型处理 IO 任务很不科学,应该换多线程或协程,比如 swoole/workerman

  • 資深大佬 : sutex777

    炫富啊。。多少流量啊

  • 資深大佬 : Aliencn

    @xiaoshouchen 这个值调多大主要是看业务特性,没有一个明确的定义。

    既然你有调整过还会出现 5XX 的错误,建议你把 PHP 相关的日志都打印出来。看在出现 5XX 错误的时候 PHP 都报什么错误。即使是进程数不够日志里也会有相关信息输出的。

    如果没有产生错误的话那就看看 PHP 前端的程序(比如 Nginx )有没有相关报错。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具