Image

知识库 → Web 服务器负载高的原因

[虚拟服务器]
出版日期: 20.10.2024

在本指南中,我们将讨论虚拟服务器上高负载的主要原因及其解决方法。

例如,当打开托管在服务器上的网站时,会出现严重的延迟,命令在控制台中执行缓慢。

1. 检查负载

例如,当有 6 个 CPU 核心时,最大负载 LA (Load Average) 应为 6。(1 表示核心的 100% 负载)

在我们的示例中,使用以下命令来检查这些指标:

top

在截图中,我们看到该指标显著超出,表明虚拟机的负载非常高。

因此,服务器运行缓慢的原因是负载严重超标。在我们的示例中,我们还看到产生负载的进程,它们的状态为 (R) - (运行中)。

在 COMMAND 列中,我们可以看到占用最多资源的命令。在我们的示例中,这是 PHP 脚本。

请注意 Tasks 参数,它显示虚拟机上的进程数量 - 总共有 752 个进程,其中 40 个进程处于活动状态。

以每天 700 名唯一访问者、每月约 21,000 名访问者的流量的站点正常运行为例,具有类似的服务器配置,其负载为:LA - 0.41,任务 - 51(2 个运行)。

或多或少明显的是,服务器受到洪水或 dos 攻击,也有可能执行脚本来发送垃圾邮件,或者服务器可能被暴露为某些资源的攻击者(攻击者将其用作代理; )。

2. 解决方案

在重负载下在控制台中有效工作通常很困难。因为在我们的例子中这些是网络服务。让我们阻止他们:

service nginx stop
service apache2 stop

在某些情况下,这些命令可能需要很长时间才能执行,那么最好强制终止进程。

查看活动进程的 pid 并使用以下命令终止它们(其中 pid 是进程 ID):

kill -9 pid

如果 top 命令需要很长时间才能启动或速度变慢,请使用 ps aux 并按进程名称过滤:

ps aux | grep nginx

这些过程完成后,负载应该恢复正常,然后您可以查看相同请求的访问日志文件并找出脚本的路径。例如,使用 tail 命令和使用 grep 过滤器。

tail -f /var/log/nginx /access.log

注意!您可能有不同的日志文件路径及其名称。

接下来,删除恶意脚本;它们的创建日期也与主文件不同。使用 mc 文件管理器时可以看到这一点。

2.1 寻找产生高负载的脚本的替代搜索

如果服务器响应你的命令有轻微的延迟(可以忍受),你可以使用以下命令找到脚本文件的名称(其中pid是php进程id):

lsof -p pid

删除恶意文件,之后服务器的负载就会减少。

在发生 dos 或 ddos 攻击时,恶意文件的存在并不是必需的。在这种情况下,您将需要安装保护,我们在此进行了更详细的描述:保护您的网络服务器免受洪水攻击

如果服务器使用流行的CMS并且很长时间没有更新,则更有可能出现此示例。





暂时没有评论