有时服务器非常慢,需要大量时间来处理请求。iotop
显示几分钟内平均磁盘读取速率为 1-2 M/S(实际上并没有那么多),之后服务器再次变得非常快。虽然非常慢,但根据 top 的说法,等待率约为 60-90%。
根据 mysql 调优入门,所有 mysql 缓存都非常好。所以我不知道为什么 mysql 服务器会进行如此多的磁盘读取。有什么方法可以找出导致 mysql 中 I/O 读取如此多的原因吗?
我不得不说这是一个虚拟服务器,那么可能是另一个客户正在使用整个 I/O 容量吗?
答案1
了解底层存储层很有用。您有单个物理磁盘吗?由几个磁盘组成的 RAID1 或 RAID5,或由多个(40 个以上)物理驱动器组成的大型存储阵列。每个物理驱动器可以为您提供大约 150-200 个请求/秒(取决于旋转速度)。
因此,iostat/sar/dstat 输出中的 MB/s 数字并不重要,因为对于顺序读取/写入,现代驱动器可以达到 100 MB/s 以上,但对于例如 8kB 大小的随机请求,它只会给您 150*8kB = 1.2 MB/s。来自数据库服务器的请求几乎总是随机的。
最好的指标始终是 io 服务时间 - 即存储为您的读取或写入请求提供服务所需的时间。您无需担心拥有多少个磁盘,如果服务时间低于 15-20 ms(毫秒),则说明您的存储性能良好。在几乎空闲的带有电池备份缓存 (BBWC) 的服务器上,您应该看到写入服务时间少于 1ms,读取时间少于 5 ms。此指标也适用于 VPS,因为即使存储正忙于为其他客户端提供服务,它也会向您显示较高的服务时间。
答案2
使用 sar 查找服务器上 io 活动的历史记录。我认为 sar 已在该服务器上配置并运行。如果没有,请执行此操作。那么可能还有其他虚拟机在进行大量 io 调用,而您的 mysql 正忙于等待 io。我建议不要将 mysql 或任何具有中等流量的数据库放在 VPS 解决方案上。如果它正在处理实际流量,那么它应该放在物理服务器上,因为 VPS 上的 io 往往很差,而具有不良 io 的 mysql 性能很差,并且整个数据库的意义都会受到影响。