优化 VPS 服务器内存

优化 VPS 服务器内存

我正在尝试做什么

服务器资源限制有时会很紧张;为了防止内存耗尽,我不得不限制服务器进程。我需要一些专家的帮助,以了解我是否走在正确的轨道上,也许还能发现任何明显的设置变化,这些变化将有助于系统更稳定地运行。

历史

最近,我的公司从共享主机升级到了 VPS。基本上,我们的共享主机已经不够用了,而且由于主机在周末因 CPU 使用率过高而暂停了我们的网站,因此开始出现问题。我们的网站用户每周周五和周六往往会翻倍或三倍,这对我们来说并不意外。(工作日每天约有 5000 次访问 [~2500 名访问者],周末约有 9500 次访问 [~4500 名访问者]。)

现在我们使用的是 VPS,没有 CPU 问题。(事实上,CentOS WHM 控制面板显示我们的 CPU 负载为“.000201%”。)但是,我们遇到了内存不足的问题,导致系统崩溃。

问题摘要

我们的网站基于 WordPress。但是,除了评论之外,几乎没有“写作”活动;大多数用户只是看到我们创建的相当静态的页面。

几个月前,也就是 2012 年 10 月,我们第一次升级 VPS 时,网站在工作日运行良好,但每到周末就会出现内存不足的情况。网站经常会反复崩溃(24 小时内偶尔崩溃 5-20 次),通常从周五晚上开始,一直持续到周六下午。

在工作日中,服务器的内存使用率持续保持在 65-90%,而在周末则会达到 100%,从而导致崩溃。

纠正措施

由于我是 VPS 新手,所以我一开始使用的是所有默认设置。后来我开始进行调整,并遵循了我在本网站和其他网站上看到的有关解决内存问题的建议。

我对 MySQL、PHP 和 Apache 进行了调整,总结如下“当前配置”。我还重新编译了 Apache 和 PHP,删除了不需要的模块。我为 WordPress (W3T) 安装了更好的缓存插件,并添加了 APC 操作码缓存。我还开始使用 gz 压缩,并将大量静态文件移至单独的子域。

我编写了一个漂亮的小脚本,用于按计划检查服务器状态,并根据需要重新启动它,它还会向我发送服务器错误日志的记录,以帮助排除故障。(我知道,这只是一个创可贴,但重要的是让网站保持在线,因为没有人愿意在周末坐在那里监控它。)

就在最近,大约一周前(2013 年 1 月),我将服务器 RAM 从 1 GB(2 GB 可突发)升级到 2 GB(3 GB 可突发)。这似乎已经解决了大部分问题,但我仍然会偶尔收到通知(大约每周一次)服务器挂起,并出现“无法应用进程槽”PHP 错误。

当前配置

它是一个 Apache 服务器,运行 CentOS 6、Apache 2(Worker MPM)、PHP 5.3.20(FastCGI/fcgi)和 MySQL 5.5.28。2 GB RAM(3 GB 可扩展)、24 个 CPU。

MySQL 当前使用约 618 MB,约占 RAM 的 20.1%。PHP 每个进程最多使用 89 MB。Apache 每个进程最多使用 14 MB。

典型的工作日top输出:

top - 15:31:13 up 89 days,  5:26,  1 user,  load average: 1.54, 1.00, 0.70
Tasks:  49 total,   1 running,  48 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.1%sy,  0.0%ni, 99.7%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3145728k total,  1046444k used,  2099284k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

不幸的是,我目前没有周末/最繁忙时段最佳输出的示例。

Apache 配置:

StartServers: 5
MinSpareThreads: 5
MaxSpareServers: 10
ServerLimit: 80
MaxClients: 56
MaxRequestsPerChild: 5000
KeepAlive: Off

PHP配置:

MaxRequestsPerProcess 500
FcgidMaxProcesses 15
FcgidMinProcessesPerClass 0
FcgidMaxProcessesPerClass 8
FcgidIdleTimeout 30
FcgidIdleScanInterval 15
FcgidProcessLifeTime 60
FcgidIOTimeout 300
FcgidMaxRequestLen 268435456

MySQL 配置:

[mysqld]
max_user_connections            = 75
net_buffer_length               = 8K
read_buffer_size                = 256K
read_rnd_buffer_size            = 512K
skip-external-locking
sort_buffer_size                = 512K

# MyISAM #
key_buffer_size                 = 32M
myisam_sort_buffer_size         = 16M
#myisam_recover                 = FORCE,BACKUP

# SAFETY #
max_allowed_packet              = 8M
#max_connect_errors             = 1000000

# CACHES AND LIMITS #
tmp_table_size                  = 104M
max_heap_table_size             = 104M
join_buffer_size                = 208K
#query_cache_type               = 0
query_cache_size                = 32M
max_connections                 = 150
thread_cache_size               = 4
#open_files_limit               = 65535
table_cache                     = 512
#table_definition_cache         = 1024
table_open_cache                = 2048
wait_timeout                    = 300

# INNODB #
#innodb_flush_method            = O_DIRECT
#innodb_log_files_in_group      = 2
#innodb_log_file_size           = 64M
#innodb_flush_log_at_trx_commit = 1
#innodb_file_per_table          = 1
innodb_buffer_pool_size         = 416M

# This setting ensures that aio limits are not exceeded
# (default is 65536, each instance of mysql takes 2661 with this enabled)
innodb_use_native_aio           = 0

# LOGGING #
log-slow-queries
log-queries-not-using-indexes

任何帮助/建议都将不胜感激。网站地址是 3abn.org。

答案1

您已经在使用 FastCGI 运行 PHP,因此我不确定您还可以采取什么措施来精简它。您现在处于十字路口。

有几个选择:

  • 一切缩小到尽可能小的数据集。用 nginx 替换 Apache(如果可以),调整 MySQL,使其不会缓冲超过需要的数据,等等
  • 增加更多 RAM
  • 将您的层级划分为专用虚拟机。一个数据库服务器、一个应用服务器和一个前端。这将使扩展变得容易得多。

编辑:您说您安装了很多缓存东西。缓存 = 占用更多 RAM,以便下一个请求可以更快。如果您的 RAM 非常低 - 缓存可能不是世界上最好的东西。

答案2

我的第一建议:离开 VPS

我已经听到足够多关于 VPS 系统内存(和 OOM-Killer)相关问题的抱怨,我认为典型的 VPS 托管提供商没有提供生产级解决方案——它不是“虚拟专用服务器”,而是“在现有操作系统之上的半虚拟化,其资源限制设计不佳,因此其行为与真实机器不同”。
(您似乎被最常见的差异所困扰:“VPS”没有交换空间,因此当您占用比提供商分配给您的内存多一个字节时,一切都会崩溃。)

如果您无法或不愿意在位于优质数据中心的自己的硬件上托管,则应考虑使用看起来像“普通”服务器的云服务,该服务器具有交换等功能(Amazon EC2 就是这样一种选择)。这些解决方案的价格介于“VPS”解决方案和专用硬件之间,但提供的操作体验更接近“真实硬件”,并让您避免现在的情况。


请注意,无论如何,您仍需要充分调整系统大小——您的 VPS/云解决方案/专用硬件应具有足够的 RAM 来处理峰值负载而无需交换。
(优质)云或专用硬件解决方案的优势在于,您可以更好地控制到达交换点时发生的情况(禁用 OOM-killer 并让其malloc()失败, 例如)。

答案3

根据您发布的信息:

。您的 VPS 似乎在 OpenVZ 或 Parallels Virtuozzo 下运行。如果托管提供商过度分配(很多都这样做),您的服务器将永远无法使用第三 GB 的内存。

最糟糕的是,您的 VPS 可能会在短时间内爆发,但随后 OOM 终止程序会开始终止进程​​。可以调整 OOM 终止程序(从托管提供商方面)以尝试防止更重要的进程被终止(比如 ssh、bind、apache、mysql - 使用优先级),但由于同一节点上的其他客户端可能运行相同的典型设置,因此这无济于事。

获得 3G 保证,禁用突发。

。如果网页确实静态且很小,则可以使用缓存反向代理。是的,缓存会占用内存。但缓存也会阻止生成 PHP 进程,而这往往非常耗时。

(您需要做一些数学运算和/或尝试......这不是一个绝对的解决方案)

. 禁用 APC,或者运行 PHP-FPM。

使用 Fcgi,每个 PHP 进程都有自己的 APC 操作码缓存。对所有 PHP 进程使用 FPM 来共享一个公共缓存。或者禁用 APC。你似乎不需要它(操作码缓存在减少 CPU 使用率方面比减少内存使用率更有效 ;))

相关内容