最近,我们的一台服务器出现故障(网络方面),但运行时间正常(因此看起来服务器并没有失去能力)。我已要求托管公司进行调查,调查后,我被告知,Apache 和 MySQL 一直占用 80% 的内存,峰值达到 95%,我可能需要为服务器添加更多 RAM。
他们添加更多 RAM 的理由之一是,我使用的是默认的最大连接数设置(MySQL 为 125,Apache 为 150),而为了处理这 150 个同时连接,我需要至少 3GB 内存,而不是我现在拥有的 1GB。
现在,我明白调整最大连接数可能比保留默认设置更好,尽管我目前并不认为这是一个问题,因为在发布之前,具有相同配置的服务器处理的流量比当前 1 或 2 个访问者还要多,我告诉自己我会根据以后的访问模式进行调整。
我也一直知道,Apache 在默认设置下比其竞争对手(如 nginx 和 lighttpd)更耗内存。尽管如此,查看我的机器的统计数据,我试图了解我的托管公司是如何获得这些数字的。
我越来越:
# free -m
total used free shared buffers cached
Mem: 1000 944 56 0 148 725
-/+ buffers/cache: 71 929
Swap: 1953 0 1953
我猜这意味着,是的,服务器目前正在保留大约 95% 的内存,但我还认为这意味着从缓冲区/缓存行来看,总共 1000 个内存中只有 71 个真正被应用程序使用。
另外我没看到任何交换:
# vmstat 60
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 57612 151704 742596 0 0 1 1 3 11 0 0 100 0
0 0 0 57604 151704 742596 0 0 0 1 1 24 0 0 100 0
0 0 0 57604 151704 742596 0 0 0 2 1 18 0 0 100 0
0 0 0 57604 151704 742596 0 0 0 0 1 13 0 0 100 0
最后,在请求页面时:
top - 08:33:19 up 3 days, 13:11, 2 users, load average: 0.06, 0.02, 0.00
Tasks: 81 total, 1 running, 80 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.3%us, 0.3%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1024616k total, 976744k used, 47872k free, 151716k buffers
Swap: 2000052k total, 0k used, 2000052k free, 742596k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24914 www-data 20 0 26296 8640 3724 S 2 0.8 0:00.06 apache2
23785 mysql 20 0 125m 18m 5268 S 1 1.9 0:04.54 mysqld
24491 www-data 20 0 25828 7488 3180 S 1 0.7 0:00.02 apache2
1 root 20 0 2844 1688 544 S 0 0.2 0:01.30 init
...
因此,我想知道,serverfault 的专家:
- 我现在真的需要更多 RAM 吗?// 更新:我真的很想了解为什么他们说我正在使用我当前所有的 RAM,以及如何证明他们推荐的 RAM 增加是合理的。
- 他们怎么计算出 150 个同时连接需要 3GB?
感谢您的帮助!
答案1
根据此处的快照,内存利用率似乎很好,不需要升级(并且可能没有帮助)。
Free 和 top 都表明只有大约 50 MB 的可用空间,但如果考虑到缓冲区,这个数字就会高得多。Linux 将使用任何未分配/未使用的物理 RAM 作为缓存和缓冲区空间。如果您的应用程序需要更多内存,brk 和 sbrk 将从缓存中取出。由于这种情况发生得更频繁,因此会对性能产生影响,但这可能根本不是问题。
现在,在流量大或维护脚本运行期间,您确实有可能偶尔出现峰值。您是否安排了任何 cron 作业来执行大量查询作为清理过程的一部分或其他什么?是否有任何东西可能会暂时吞噬 RAM 然后释放它?帐户冻结批处理作业或其他什么?
话虽如此,你能再描述一下你的问题吗?如果你无法 ping 系统,我强烈建议高度完全不怀疑这是内存问题。你的服务器是不是突然停止运行了一段时间然后又恢复了?检查一下这段时间的 Web 服务器日志,是不是所有人都处于不活动状态,还是只有你处于不活动状态?如果你的机器在一段时间内突然停止运行,我认为这是网络问题。
dmesg 输出怎么样?网络设备错误?
答案2
他们怎么计算出150个同时连接需要3Gb?
150 * 单个 Apache 客户端的平均 RAM(对于您的情况,他们显然已决定为 20 MB)。
答案3
“午餐前目前有 1 或 2 名访客”
如果您有 1-2 个访问者,则问题不是最大连接数,可能不是 RAM 问题,而是配置问题。它可能是 Mysql 为索引和查询缓存保留的缓存 RAM。
答案4
您的 apache 使用的内存取决于 php 内存使用情况、已加载的 apache 和 php 模块数量以及连接数量。
您始终希望检查最坏情况:
MEMOF(最大 php 内存、最大已加载模块)x 最大 apache 连接数
,并且您始终希望避免进入交换,因此结果应该小于您的物理内存量。
您还运行着 mysql 服务器,因此您还必须考虑它的最大内存使用情况。
您可以进行许多配置优化来减少内存使用量,同时保持站点快速稳定(在 serverfault 中进行搜索 - 您可以在这里找到有用的讨论)。