![尽管内存和 CPU 使用率较低,VPS 仍然运行缓慢](https://linux22.com/image/749492/%E5%B0%BD%E7%AE%A1%E5%86%85%E5%AD%98%E5%92%8C%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E8%BE%83%E4%BD%8E%EF%BC%8CVPS%20%E4%BB%8D%E7%84%B6%E8%BF%90%E8%A1%8C%E7%BC%93%E6%85%A2.png)
最近,托管在 VPS 上的网站有时很难访问,我正在尝试找出原因。我注意到以下事情:
- CPU 和内存使用率非常低(如果我们把所有东西加起来的话总是<15%,但通常甚至更低);
- 网站加载速度极慢,但每当我通过 SSH 连接到 VPS 时,它都运行非常顺畅;
- 我检查了 phpMyAdmin 中的活动,每当出现这些减速情况时,统计页面就需要很长时间才能刷新(设置为 5 秒时最多需要 20-30 秒 - 但每秒的查询数似乎没有增加);
- 它似乎并不依赖于在线人数。
考虑到这些观察结果,我应该尝试检查/调试什么才能找到解决方案?
谢谢你!
答案1
这可能是由许多不同的问题引起的。无论出于何种原因,您的进程似乎正在等待需要一些时间才能完成的事情。这是否是 IO 值得怀疑,因为您会看到更高的平均负载。问题是什么。如果 VPS 是 Linux,请尝试以下几件事:
sysstat 包中的 iostat 将诊断是否是 IO 问题
在执行缓慢请求时运行进程的 strace -fp。完成后按 Ctrl-c strace。观察缓慢请求期间的系统调用。它可能会在一个请求上停止然后继续。strace 会转储大量信息,因此您可能需要使用 -o。如果其他连接是并发的并且由另一个线程中的同一进程处理,它还可能转储来自其他连接的大量信息。
增加应用程序/数据库中的日志记录并尝试缩小问题范围
我猜想您在代码或日志中对连接源执行了反向查找。如果同步执行此操作,则每个连接都将等待 DNS 服务器的响应,从而缩短您的响应时间。
另一种可能性是,您正在使用 mysql 和 myisam 作为其存储类型,并且有大量并发写入。Myisam 执行表级锁定(或至少以前如此)。整个表将被锁定以进行写入,直到查询/写入完成为止。每个连接都必须依次等待才能写入数据库。