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