我有一个托管在 Vultr HF 8CPU 服务器上的 WordPress 学习平台 (LearnDash) 网站。这太过分了,我的网站目前没有接近 CPU 或 RAM 限制。然而,有时站点“负载”会变高并且磁盘操作会激增。该网站仍然可以运行,但在一段时间内速度会变慢。
我仍在调查,但我相信这是一个 30 名左右的学生同时注册的情况(使用 WordPress 插件 uncanny groups 注册代码,在其中创建他们的帐户,然后立即分配给 LearnDash 课程和小组)。
考虑到高规格服务器,这种同时注册的方案真的会最大化磁盘读/写吗?或者它不太可能引起峰值?
当然,如果说 200 个用户同时进行测验(这种情况不会出现任何站点问题),由于不断读取和写入 DB,情况应该是类似的,但我的服务器可以正常处理。
我想还有其他网站有许多同时注册而不会减慢网站速度(暂时高负载)?
问题是,如果我是正确的,这些学生就会立即开始探索该网站,并且他们的第一堂课的负载会保持在很高的水平,并会影响该网站上的其他人。
通常我的网站可以毫无问题地处理 100 个并发用户,但似乎一群人一起注册是有问题的。
我对管理自己的服务器还很陌生,所以请友善。如果有人愿意就 1. 同时用户注册是否可能是问题以及 2. 如何缓解这个问题提供一些建议,我将非常感激。
已经联系了 Vultr 和我的控制面板“RunCloud”,他们都没有提供太多帮助。
请记住负载是什么:在 cpu 上运行或可运行但正在等待资源(通常是 cpu 和/或磁盘)的进程数。很多人认为是cpu的原因,但等待磁盘往往是负载的原因。(我有时希望单独测量 cpu 和磁盘的负载,但这很复杂。)
用于
vmstat 3
查看活动是什么 - 确保您没有破坏交换。(我在我的服务器上根本不使用交换 - 当尝试很好地关闭进程时,允许交换崩溃或花费很长时间进行分页是有风险的 - 我宁愿“快速失败”也不愿与服务器运行速度慢得令人难以置信。)尝试使用 iotop(1) 实用程序来查看是否可以找出正在使用磁盘的内容。但是,如果有许多短暂的进程正在冲击磁盘,您可能无法实时捕获它们。将事件与日志中的活动联系起来也可以为您提供帮助。
您的插件可能存在一些病态的多线程方面,具体取决于数据库的使用方式。如果是 mysql/mariadb,请尝试
echo "show full processlist;" | mysql | tee /tmp/somelogfile.log
例如,并调查是否有长时间运行的查询正在访问磁盘甚至 CPU(我发现这通常与表上缺乏索引或构造不良的连接子句有关。您可以在 mysql 中的查询上使用“explain”来查看它们的用途。有关详细信息,请参阅有关 mysql 性能的文章。)如果在 mysql/服务器崩溃的情况下,您可以在事务中承受数秒的数据丢失,则可以调低 mysql 的默认 ACID 兼容设置(有关详细信息,请参阅 DBA stackexchange),这对于不支持 ACID 的工作负载来说可能过于激进。需要它,导致小写入的病态同步。
确保您的数据库位于快速 SSD/nvme 上,而不是 HDD 上。调整 mysql(或您正在使用的任何数据库、postgres 等)中的缓存。无数文章描述了如何进行。
软件负责负载,如果平台/服务器本身对于其他用途来说速度很快,那么它本身可能不是问题。