公司项目代码比较老,运行了很多年,存在很多坑。
最近迁移到aliyun都,因为阿里云的配置不高,mysql成为了瓶颈。
项目架构是nginx做代理,请求交给php-fpm处理,php连接mysql处理业务。
最近一个前端页访问量比较大,前端页面有一个比较复杂的实时统计,导致mysql服务器cpu直接100%了。
因为mysql卡住了,所有的php-fpm进程与mysql保持着连接状态,傻傻的等待mysql响应。
没有多余的php-fpm来处理nginx新进来的请求,导致前端页面报502错误。
我研究了一下,php连接mysql时可以设置MYSQL_OPT_READ_TIMEOUT参数来避免mysql因执行慢长时间不返回导致php-fpm进程一直被占据,无法处理新请求。
但是我们项目比较旧,使用的还是最老的mysql扩展,不支持MYSQL_OPT_READ_TIMEOUT。
如果在php.ini里设置mysqlnd.net_read_timeout 会影响全局(我们项目里很多cli方式运行耗时任务)。
有没有一种mysql的代理或者网关组件,能控制php等待mysql的返回时间?
比如实现php发送sql给mysql,mysql在20s内没有返回,php直接断开与mysql的连接
卡在数据库,我感觉用webman也是一样的等待mysql tcp的数据回复,毕竟workerman也是多进程阻塞
可以试试这个
https://github.com/louislivi/smproxy