我的专用服务器上的 Apache 经常挂起,因为连接停留在“发送回复”状态:
这种情况每天至少发生几次 - 有时 2 或 3 个小时都不会发生,有时它会持续发生,以至于所有连接都会被占用,并在重新启动 apache 后 5 分钟内卡在发送回复中。这导致网站不断停机。这些请求中的 IP 通常是 Amazon AWS 或 Cloudflare(我在许多网站上使用 Cloudflare,Amazon AWS IP 可能是因为网站使用 Ezoic 名称服务器)访问网站上的各种 URL。上面屏幕截图中的“SS”列显示了连接卡住的时间 - 在此示例中,每个请求都卡住了数百秒,因此有些地方非常不对劲。
这些是简单的 Wordpress 网站,通常没有图片,没有不寻常的插件,非常简单,绝对没有不寻常的东西会导致页面加载时间过长。然而,每个网站上都有 5,000 到 100,000 多个帖子,每天可能会发布多达数千个帖子(使用插件“WP all import pro”),这些帖子计划在导入后的 24 小时内随机发布。服务器上有 10 多个这样的网站,但只有 3 或 4 个网站不断出现在 Apache 状态中,连接卡住。
在服务器上的所有站点中,每月的页面浏览量刚刚超过~500,000,应该可以由我的服务器轻松处理(来自 namecheap:XEON E3 1240 V3 8GB DDR3 1TB HDD SATA)。
Mysql 经常在服务器上处于高负载状态,有时在 phpmyadmin 中查看进程列表时会出现查询卡住或有时出现 NULL 查询。运行 'top' 命令也经常显示非常高的 CPU 使用率(我的服务器有 4 个 CPU 核心)。示例截图:
令人担忧的是,/var/lib/mysql 中的 mysql 错误日志现在大小超过 3GB,大到我甚至无法读取 - 重命名它并检查生成的新日志显示许多“读取通信数据包时出错”错误。我不知道这是否是 apache 中卡住连接的问题,如果是,该怎么办。
我尝试过更改所有可能的 apache 设置,例如将 Max Request Workers 从默认的 150 改为 150,以便可以建立更多连接(这没有帮助,因为任何新连接也会被占用和卡住),禁用所有插件或在 wordpress 网站上尝试不同的主题(没有效果),以及更改 my.cnf 中的一些不同的 mysql 设置(根据https://serverfault.com/a/989269/548654) 没有任何改善。我还尝试将其中一个问题站点的所有数据库表从 MyISAM 更改为 InnoDB,但连接仍然卡住。我还能尝试什么来解决这个问题?
答案1
关于MySQL:
“等待表级锁定”意味着正在运行某种管理任务(例如 ALTER TABLE)。这是完整的 PROCESSLIST 吗?通常,可以通过“时间”略大于运行时间最长的“卡住”查询来发现有问题的查询。
慢速日志是事后捕获长时间运行的查询的另一种方法。
WordPress 中一个可修复的缓慢问题是在元表定义中:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta