Amazon EC2 服务器运行非常缓慢

Amazon EC2 服务器运行非常缓慢

我在 AWS EC2 上有一个运行 Ubuntu 12.04 的 c1.medium 层服务器。我们将其用作开发服务器,上面托管 5-8 个 Drupal 7 站点。最近,该服务器的运行速度非常慢,我很难找到原因。我搜索了日志,但没有发现任何明显的问题。我注意到,每当服务器开始缓慢/崩溃时 - 查看 EC2 控制台上的云监视图表,总会有一个异常峰值。关于如何调查和识别这些问题以及它们来自何处的任何建议。我已附加top我的 apache2.conf 文件的输出和片段。

任务:共 117 个,其中 1 个正在运行,113 个正在休眠,3 个已停止,0 个僵尸
CPU:0.0%us、0.0%sy、0.0%ni、100.0%id、0.0%wa、0.0%hi、0.0%si、0.0%st
内存:总计 1733244k,已用 1647596k,可用 85648k,缓冲区 4612k
交换:总计 917500k,已使用 644984k,可用 272516k,缓存 69512k

  PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令                                                                                                                                                
16417 mysql 20 0 1317m 199m 1784 S 0 11.8 3:19.84 mysqld                                                                                                                                                 
18087 www-数据 20 0 483m 139m 3132 S 0 8.3 0:11.15 Apache2                                                                                                                                                
18019 www-数据 20 0 483m 136m 3208 S 0 8.1 0:13.52 Apache2                                                                                                                                                
18088 www-数据 20 0 477m 131m 2952 S 0 7.8 0:10.31 Apache2                                                                                                                                                
17958 www-数据 20 0 533m 130m 2948 S 0 7.7 0:16.77 Apache2                                                                                                                                                
17959 www-数据 20 0 450米 103米 3192 S 0 6.1 2:05.47 Apache2                                                                                                                                                
17987 www-数据 20 0 443m 97m 3188 S 0 5.8 0:10.76 Apache2                                                                                                                                                
17961 www-数据 20 0 438m 95m 3180 S 0 5.7 0:13.21 Apache2                                                                                                                                                
18089 www-数据 20 0 443米 83米 317​​2 S 0 4.9 0:06.69 Apache2                                                                                                                                                
18068 www-数据 20 0 412m 68m 3148 S 0 4.0 0:07.99 Apache2                                                                                                                                                
18459 www-数据 20 0 411m 68m 3204 S 0 4.0 0:01.27 Apache2                                                                                                                                                
17960 www-数据 20 0 410m 67m 3812 S 0 4.0 0:06.79 Apache2                                                                                                                                                
18283 ubuntu 20 0 26720 6908 0 S 0 0.4 0:00.59 bash                                                                                                                                                   
18460 www-数据 20 0 350m 2788 804 S 0 0.2 0:00.00 Apache2                                                                                                                                                
13391 根 20 0 350m 1700 16 S 0 0.1 0:03.25 apache2                                                                                                                                                
17830 ubuntu 20 0 26768 1468 620 S 0 0.1 0:01.48 bash                                                                                                                                                   
18463 ubuntu 20 0 17332 1288 944 R 0 0.1 0:00.04 顶部                                                                                                                                                    
 8024 根 20 0 2632m 936 0 S 0 0.1 14:24.58 java                                                                                                                                                   
18134 根 20 0 73352 772 0 S 0 0.0 0:00.06 sshd                                                                                                                                                   
18282 ubuntu 20 0 73352 756 0 S 0 0.0 0:00.03 sshd                                                                                                                                                   
    1 根 20 0 24420 516 0 S 0 0.0 0:13.99 初始化                                                                                                                                                   
  909 后缀 20 0 27372 348 208 S 0 0.0 0:43.46 qmgr                                                                                                                                                   
  797 根 20 0 15972 320 232 S 0 0.0 25:04.39 中断平衡                                                                                                                                             
  900 根 20 0 25096 272 172 S 0 0.0 1:49.94 主站                                                                                                                                                 
  664 系统日志 20 0 248m 244 0 S 0 0.0 18:20.90 rsyslogd                                                                                                                                               
16201 ubuntu 20 0 73468 220 0 S 0 0.0 0:00.07 sshd                                                                                                                                                   
16904 Ubuntu 20 0 73468 216 0 S 0 0.0 0:00.03 sshd   
超时 20
保持活动状态
最大KeepAliveRequests 500
KeepAliveTimeout 2
如果模块 mpm_prefork_module>
    启动服务器 5
    最小备用服务器数 5
    最大备用服务器数 12
    最大客户数 40
    每个子项的最大请求数 10000
/IfModule>

我对这一切完全陌生。任何建议都非常感谢。谢谢

答案1

安装atop并运行它作为守护进程,记录到/var/log/atop.log。然后,下次您遇到严重的负载峰值时,您可以运行atop -r /var/log/atop.log并查看发生这种情况时的机器状态(使用 键t快速浏览日志)。

atoptop在它向您展示的数据的实用性和完整性方面优于。

答案2

您的内存使用量似乎很高。我可以看到,当您从 top 收集该信息时,您使用了相当多的交换空间,但问题实际上是进出交换的数据量,而不是使用量。我猜是这样的。

您的交换已用数字是否从读取变为读取?如果是这样,那几乎肯定是您的问题,无论如何,减少内存使用量和/或为虚拟机添加 RAM 都会对您有所帮助。

另外,如果搅动交换是您的问题,那么当您的机器正在执行任何操作时,您会看到处于等待状态的进程数增加。它在您的列表中是“0.0%wa”,但鉴于系统显示 100% 空闲,我推测它位于可能导致问题的 Web 请求之间。

只需进行粗略计算,如果您的 apache 进程当前每个消耗大约 5% 的 RAM(甚至更多),那么允许最多 40 个进程(MaxClients)就会很麻烦,并且会使用大约两倍于实际拥有的 RAM。

对于像您这样的小型开发机器,我会将 apache 进程的数量固定在一个较小的数字,不进行太多的动态移动,并经常回收 apache 进程。同时将 keepalive 保持很短,这样这些进程就不会被长时间占用。

Timeout 20
KeepAlive On
MaxKeepAliveRequests 500
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       3
    MaxSpareServers      5
    MaxClients           5
    MaxRequestsPerChild  10
</IfModule>

如果同时有超过一两个人使用此功能,请考虑将静态内容交付交给单线程且内存使用量较少的程序。您可以从 nginx 等较轻量的 httpd 交付静态内容,但更简单的方法是设置 squid 之类的程序作为前端代理缓存,缓存量可能为 50 到 100 MB。

确保使用 APC 缓存来缓存已编译的 PHP。使用 APC 时,您需要增加分配给缓存的空间量,这实际上会大大减少 RAM 使用量,因为已编译的 PHP 将位于共享的 mmapped 内存中,而不是在每个请求时在每个 apache 进程中单独编译。

相关内容