Apache 和 MySQL 占用了所有内存?最大连接数是多少?

Apache 和 MySQL 占用了所有内存?最大连接数是多少?

最近,我们的一台服务器出现故障(网络方面),但运行时间正常(因此看起来服务器并没有失去能力)。我已要求托管公司进行调查,调查后,我被告知,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 的专家:

  1. 我现在真的需要更多 RAM 吗?// 更新:我真的很想了解为什么他们说我正在使用我当前所有的 RAM,以及如何证明他们推荐的 RAM 增加是合理的。
  2. 他们怎么计算出 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 中进行搜索 - 您可以在这里找到有用的讨论)。

相关内容