索引
发现到服务器的 CPU usage 在不到50%,也就是CPU 没有满载,内存 usage 也还有剩余的情况之下,宝塔面板所显示的负载状态却100%甚至超过(状态最多是显示100%),这时候网站效率可能会受到影响,原因是因为磁盘 IO 的负载可能已经超过原有的负荷,所以宝塔负载状态这时候可能会保持在100%。
可能原因
以下列几种可能性因素:
网站日志
有些网站或程序在功能上面有自带日志写入功能,假设今天你使用的是站群程序,那么你很有可能会遇到负载状态100%的情况,而且会影响到站群网站的访问,甚至会出现 502。
数据库日志
如果你有使用定时脚本与数据库互动的情况下,也有可能增加负载状况,数据库有 bin 日志、慢日志、错误日志等多种log,服务器的磁盘若不是固态硬盘而是HDD,在大量网站运行之下,会有负载状态大幅提升的可能性。
防火墙插件日志
这也是其中原因之一,因为插件本身也是在服务器底下运行,因此插件上面的所有数据内容,只要你看的到的东西,都是经过代码而写入的日志,这些都会增加磁盘IO的负载。
监控报表日志
这个跟防火墙插件的道理是一样的,当你运行大量网站,监控插件就会开始记录你所有网站的”所有情况”,而插件要记录你所有情况就得写入大量的信息到文档里面。
解决方法
打开ssh,键入以下指令:
iostat -x 1 10
将feedback 传给 chatgpt 请它分析情况,注意一点,chatgpt 所有的回答并不一定会符合你服务器的需求,所以在修改一些核心配置的时候,建议逐步进行。
打开 my.cnf(Linux) 或 my.ini(Windows)
[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_lru_scan_depth = 1024
innodb_log_file_size
建议在 256M 至 1024M 的范围之间。
innodb_buffer_pool_size
从4G开始逐步增加,若发现数据库错误日志很多,每次增加1G至2G,错误日志大致上是长这样:
2024-07-16T22:22:17.570995Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 13913ms. The settings might not be optimal. (flushed=150 and evicted=0, during the time.)
innodb_io_capacity
可以控制数据库的磁盘IO操作
innodb_flush_method = O_DIRECT
设置这个是为了避免重复缓存
innodb_flush_log_at_trx_commit
这个参数是优化innodb日志写入的策略,1 表示日志持久性高但效能差, 2 表示innodb递交立即写入日志,在递交时不执行实际IO,0 表示innodb每秒将缓冲日志更新到硬盘,算是效能最好的。这三种策略取决于自己目前服务器状态可以应用哪种策略,因为本文章聚焦的是硬盘IO负载问题,因此设定为2。
请注意一件事情,你看不到的地方如果也在记录某些东西,那你就要小心,因为你不知道你哪个地方被写入了多少东西进去,这时候你可以观察你的硬盘容量的变化是否有异常增加。
其他的,改天再更新。