Kafka生产者传输PHP应用日志时出现资源不可用错误求助
解决Nginx连接PHP-FPM Socket失败&生产者负载升高问题
看起来你的问题核心是Nginx无法连接PHP-FPM的Unix Socket(错误码11: Resource temporarily unavailable),而且这个情况是在搭建Kafka日志传输后出现的——显然是Kafka日志发送逻辑拖慢了PHP进程,导致PHP-FPM进程池被占满,请求排队甚至无法处理新请求。咱们一步步来排查解决:
一、先搞懂错误本质
这个错误直白来说就是:PHP-FPM没有足够的空闲进程来处理Nginx转发的请求了。因为你引入了Kafka日志传输,PHP进程需要花额外时间和Kafka Broker交互(如果是同步发送的话,还要等待Broker响应),进程释放变慢,新请求过来时就没资源可用了。
二、调整PHP-FPM进程池配置
这是最直接的缓解手段,先检查并修改你的PHP-FPM配置文件(通常在/etc/php/7.0/fpm/pool.d/www.conf):
pm.max_children:这是PHP-FPM能启动的最大子进程数,根据服务器CPU核数和内存来设置。比如2核CPU、2G内存的机器,每个PHP进程大概占20-50M内存,你可以把这个值设为20-30(别超过内存承载上限,避免OOM)。pm.start_servers:启动时默认开启的进程数,建议设为(pm.min_spare_servers + pm.max_spare_servers) / 2,比如如果min是5、max是10,这里就设为7。pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数,确保有足够的空闲进程随时处理新请求,建议分别设为5和15(根据服务器规模调整)。pm.max_requests:每个进程处理N个请求后自动重启,防止内存泄漏导致进程占用过高,建议设为1000-2000。request_terminate_timeout:单个请求的最大处理时间,如果Kafka发送日志耗时较长,可以适当调大(比如从默认的30s改成60s),避免进程被强制杀死但请求还没处理完。
修改完配置后,重启PHP-FPM生效:
sudo service php7.0-fpm restart
三、优化Kafka日志发送逻辑(关键!)
问题的根源是Kafka传输拖慢了PHP进程,所以必须优化发送逻辑,减少进程阻塞:
- 改用异步发送:PHPrDKafka支持异步发送模式,不要用同步等待Broker响应的方式。比如设置
produce(RD_KAFKA_MSG_F_BLOCK, ...)改为非阻塞模式,或者使用回调函数处理发送结果,让PHP进程不用等待Kafka响应就能继续处理下一个请求。 - 批量发送日志:不要每条日志都单独调用Kafka发送接口,攒一批日志(比如每10条或者每500ms)再一次性发送,大幅减少网络交互开销。
- 调整Kafka客户端缓冲配置:在PHPrDKafka的生产者配置里,设置
queue.buffering.max.ms(比如设为100ms,缓冲100ms内的日志一起发)和queue.buffering.max.messages(比如设为50,攒够50条再发),让客户端自动批量处理。 - 检查Broker状态:如果Kafka Broker本身负载高、响应慢,也会拖慢PHP进程。去Broker机器上看Kafka日志,检查是否有消息堆积、磁盘IO过高或者网络延迟的问题。
四、Nginx侧辅助优化
- 调整FastCGI超时参数,避免Nginx因为等待PHP响应超时而报错:在Nginx的server或location配置里添加:
fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; - 如果你的业务允许,可以开启Nginx的FastCGI缓存,减少重复请求对PHP-FPM的压力(动态请求谨慎使用)。
五、监控验证
修改完配置后,用以下命令监控状态:
- 查看PHP-FPM进程数:
ps aux | grep php-fpm,看是否有足够的空闲进程。 - 查看Nginx错误日志:
tail -f /var/log/nginx/error.log,确认是否还有连接失败的错误。 - 监控服务器负载:
top或者htop,看CPU和内存使用率是否恢复正常。
内容的提问来源于stack exchange,提问作者Neha Kashyap
相关产品推荐
相关产品推荐

