优化 VPS 服务器内存

Mic*_*ael 5 mysql php optimization memory apache-2.2

我想做什么

服务器资源限制有时会很紧张;为了防止内存耗尽,我不得不限制服务器进程。我需要一点专家的帮助来知道我是否在正确的轨道上,并且可能会发现任何明显的设置更改,以帮助系统以更高的稳定性运行更多。

历史

最近我的公司从共享主机升级到了 VPS。基本上我们已经超出了我们的共享主机,并且由于周末 CPU 使用率过高,主机暂停了我们的网站,因此开始出现问题。我们的网站用户倾向于每周在周五和周六增加一倍或三倍,这在我们的案例中并不意外。(一周内每天约 5000 次访问 [~2500 名访客],周末约 9500 次访问 [~4500 名访客]。)

现在我们在 VPS 上,我们没有 CPU 问题。(事实上​​,CentOS WHM 控制面板说我们处于“.000201% CPU 负载”。)但是,我们遇到了内存不足问题,导致崩溃。

问题概要

我们的网站是基于 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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有周末/最繁忙时间最高输出的当前示例。

阿帕奇配置:

StartServers: 5
MinSpareThreads: 5
MaxSpareServers: 10
ServerLimit: 80
MaxClients: 56
MaxRequestsPerChild: 5000
KeepAlive: Off
Run Code Online (Sandbox Code Playgroud)

PHP配置:

MaxRequestsPerProcess 500
FcgidMaxProcesses 15
FcgidMinProcessesPerClass 0
FcgidMaxProcessesPerClass 8
FcgidIdleTimeout 30
FcgidIdleScanInterval 15
FcgidProcessLifeTime 60
FcgidIOTimeout 300
FcgidMaxRequestLen 268435456
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

pau*_*ska 3

您已经使用 FastCGI 运行 PHP,所以我不确定您还可以做些什么来简化它。你现在正处于十字路口..

有几个选项:

  • 所有内容调整到尽可能小的数据集。用 nginx 替换 Apache(如果可以的话),调整 MySQL,使其不会缓冲超出需要的数据等等
  • 在盒子里投入更多内存
  • 将您的层划分为专用虚拟机。一台数据库服务器、一台应用服务器和一台前端。这将使它更容易扩展。

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