我在 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米 3172 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
快速浏览日志)。
atop
top
在它向您展示的数据的实用性和完整性方面优于。
答案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 进程中单独编译。