服务器各项指标负载都在80%以内项目却频频超时问题解决

近期公司项目后台频频超时,分析下原因

2024-08-14 00:11:07   2025-02-11 01:48:44   PHP   60 views  

 

近期公司服务器项目频频超时,服务器配置是OK的并且也只有一个项目和两个H5前端.先解决了日志报错中的Console任务中的sleep时间问题,但依然会出现问题。会后发现有一个共同点就是重启Nginx就会好,最后发现是跑的任务太多(要实时轮询三大运营商各个卡的用量\实名\余量等数据)导致FPM子进程数不足,在这里记录一下同样状态下的所有可能和解决方案。

服务器的各项负载都没有超过80%,但 Laravel 项目访问超时,重启 Nginx 后暂时恢复正常,随后又会再次超时。这种现象通常可能由以下几种原因引起:

1. Nginx 连接数或进程限制

  • 连接数限制:Nginx 配置中有可能设置了过低的 worker_connectionsworker_processes,导致在并发请求较高时,Nginx 无法处理更多的请求,出现请求积压,最终导致超时。
  • 进程限制worker_processes 设置过低可能导致无法充分利用多核 CPU,进而导致请求处理能力不足。

    解决方案

  • 检查并增加 Nginx 的 worker_processesworker_connections 配置。例如:
     worker_processes auto;
     events {
         worker_connections 1024;
     }
  • 使用 ulimit -n 检查系统对打开文件描述符(也影响到最大连接数)的限制,必要时调整这个限制。

2. PHP-FPM 配置问题

  • PHP-FPM 子进程数不足:Laravel 使用 PHP-FPM 处理请求,如果 PHP-FPM 的 pm.max_children 配置过低,可能会导致无法同时处理多个 PHP 请求,造成请求堆积和超时。
  • 慢查询或阻塞:一些慢查询或阻塞操作可能导致 PHP-FPM 进程长时间占用,从而无法及时处理新的请求。

    解决方案

  • 检查并调整 PHP-FPM 配置,增加 pm.max_children 的值。例如:
     pm.max_children = 50
     pm.start_servers = 5
     pm.min_spare_servers = 5
     pm.max_spare_servers = 35
  • 使用 php-fpm slow log 检查是否有慢查询或阻塞操作。

3. Laravel 应用程序瓶颈

  • 缓存配置:检查 Laravel 的缓存配置是否合理,例如使用了文件缓存而不是更高效的 Redis 或 Memcached。
  • 数据库连接池:检查数据库连接池的配置,确保数据库连接数足够高。
  • 队列工作器:如果 Laravel 使用了队列,检查队列工作器是否正常工作,有没有阻塞的任务。

    解决方案

  • 优化 Laravel 的缓存机制,尽量使用内存缓存。
  • 调整数据库连接池配置,确保足够的数据库连接可用。
  • 使用性能监控工具如 Laravel Telescope 或 New Relic 来监控应用程序性能,识别瓶颈。

4. 系统资源问题

  • 内存不足:尽管各项负载不高,但如果内存不足,可能导致系统频繁使用交换空间(swap),从而降低性能。
  • I/O 性能:硬盘 I/O 性能低下,特别是在使用文件缓存时,可能导致请求处理缓慢。

    解决方案

  • 使用 free -mvmstat 检查内存使用情况,增加物理内存或优化内存使用。
  • 使用 iostatdstat 检查 I/O 性能问题,必要时升级硬盘到 SSD 或优化 I/O 操作。

5. Nginx 配置中的 keep-alive 设置

  • keep-alive 超时:Nginx 配置中的 keep-alive 设置不当可能会导致连接不能被及时释放,占用连接资源,最终导致请求堆积。

    解决方案

  • 检查并调整 keep-alive 设置,例如:
     keepalive_timeout 65;
     keepalive_requests 100;

6. 网络问题

  • 网络带宽:网络带宽可能不足,导致请求无法及时发送或接收。
  • DNS 问题:DNS 解析速度慢可能导致请求的初始延迟。

    解决方案

  • 检查网络带宽使用情况,必要时升级带宽。
  • 优化 DNS 解析,或使用本地缓存 DNS。

通过检查和调整上述方面的配置和性能,应该能够解决 Laravel 项目访问超时的问题。如果问题依然存在,建议使用性能监控工具对系统进行全面分析,以便找出具体的瓶颈。