我在做什么
服务器资源限制有时会紧张; 为了防止内存耗尽,我不得不限制服务器进程。 我需要一个小小的专家帮助来了解我是否在正确的轨道上,并且可能会发现任何明显的设置更改,这将有助于系统运行更稳定。
历史
最近我的公司升级到VPS,从共享主机。 基本上我们超过了我们的共享主机,并且由于主机暂停我们的网站而开始有问题,因为周末CPU使用率过高。 我们的网站用户每星期五和星期六往往会翻一番或三倍,这在我们的例子中并不出乎意料。 (每周约有5000次访问(约2500人次),周末大约有9500次访问(约4500次))
现在我们正在使用VPS,我们没有CPU问题。 (事实上,CentOS WHM控制面板说我们处在“.000201%的CPU负载”)。但是,我们有内存不足的问题,导致崩溃。
问题摘要
我们的网站是基于WordPress的。 但是,除了评论之外,很less有“写作”活动。 大多数用户只是看到我们创build的相当静态的页面。
当我们几个月前第一次升级到VPS时,在2012年10月,这个网站在一周内运行良好,但每个周末都记忆犹新。 通常会在周五晚上反复地(24小时内,偶尔会有5-20次)崩溃,并持续到周六下午。
在本周内,服务器的内存使用率一直保持在65-90%,周末则会达到100%,导致崩溃。
采取的步骤正确的IT
由于我是VPS的新手,我开始使用所有的默认设置。 我后来开始调整,听取了关于解决这个网站和其他网站上的记忆问题的build议。
我已经对MySQL,PHP和Apache进行了调整,总结如下“当前configuration”。 我也重新编译Apache和PHP来删除不需要的模块。 我为WordPress(W3T)安装了一个更好的caching插件,并添加了APC操作码caching。 我也开始使用gz压缩,并将很多静态文件移动到一个单独的子域。
我写了一个漂亮的小脚本按计划检查服务器状态,并根据需要重新启动它,并且还向我发送服务器错误日志的副本,以帮助排除故障。 (我知道,如果是这样的话,这只是一个创可贴,但是让网站保持在线是很重要的,因为周末没有人想坐下来监视它。)
就在最近的一周前(2013年1月),我将服务器RAM从1 GB(2 GB可突发性)升级到2 GB(3 GB可突发性)。 这似乎已经解决了大部分的问题,但我仍然偶尔会注意到(服务器一个星期左右),以及“无法应用进程槽”的PHP错误。
目前的configuration
这是一个运行CentOS 6,Apache 2(Worker MPM),PHP 5.3.20(FastCGI / fcgi)和MySQL 5.5.28的Apache服务器。 2 GB RAM(3 GB突发),24个CPU。
目前MySQL使用约618 MB,大约20.1%的RAM。 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
不幸的是我目前没有周末/最繁忙的时间最高输出的例子。
Apacheconfiguration:
StartServers: 5 MinSpareThreads: 5 MaxSpareServers: 10 ServerLimit: 80 MaxClients: 56 MaxRequestsPerChild: 5000 KeepAlive: Off
PHPconfiguration:
MaxRequestsPerProcess 500 FcgidMaxProcesses 15 FcgidMinProcessesPerClass 0 FcgidMaxProcessesPerClass 8 FcgidIdleTimeout 30 FcgidIdleScanInterval 15 FcgidProcessLifeTime 60 FcgidIOTimeout 300 FcgidMaxRequestLen 268435456
MySQLconfiguration:
[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
任何帮助/build议将不胜感激。 网站地址是3abn.org。
您已经使用FastCGI运行PHP,所以我不确定还有什么可以做的。 你在这里的十字路口
几个选项:
编辑:你说你已经安装了很多caching的东西。 caching=吃更多的RAM,以便下一个请求将更快。 如果你的RAM很低,caching可能不是世界上最好的东西。
我的第一个build议是: closuresVPS 。
我已经听说VPS系统的内存(和OOM-Killer)相关的问题,我认为典型的VPS托pipe服务提供商没有提供生产级解决scheme – 这不是“虚拟专用服务器”,而是“在现有操作系统之上进行半虚拟化,devise不良的资源限制因此performance出与真实机器不同的性能“。
(你似乎被最常见的差异所困扰:一个“VPS”没有交换空间,所以当你咀嚼了甚至超过你提供者分配的一个字节的RAM时,情况就会崩溃。
如果您无法或不愿意在位于质量数据中心的自己的硬件上进行托pipe,则应该考虑使用交换等(Amazon EC2就是这样一种select)的“正常”服务器。 这些解决scheme定价在“VPS”解决scheme和专用硬件之间,但提供的操作体验更接近“真正的硬件”,让您避免像现在这样的情况。
请注意,在任何情况下,您仍然需要充分调整系统的大小 – 您的VPS /云解决scheme/专用硬件应该有足够的RAM来处理峰值负载,而无需交换。
(质量)云或专用硬件解决scheme的优点是,您可以更好地控制到达交换点时发生的情况(例如, 禁用OOM杀手并让malloc()失败 )。
从你发布的信息:
。 您的VPS似乎在OpenVZ或Parallels Virtuozzo下运行。 如果托pipe服务提供商重新定位(很多),您的服务器将永远无法使用第三个内存。
最糟糕的是,你的VPS可能会被允许爆炸一段时间,但是OOM杀手会开始杀死进程。 OOM杀手可以调整(从主机提供商一方),以防止更重要的进程被杀害(比如ssh,bind,apache,mysql–使用优先级),但是由于同一节点上的其他客户端可能运行相同的典型设置,这是没有帮助的。
获得3G保证,突发禁用。
。 如果网页真的是静态的,可以使用caching逆向代理。 是的,caching使用内存。 但是高速caching也阻止产生PHP进程,这往往是非常苛刻的。
(你需要做一些math和/或尝试…这不是一个绝对的解决scheme)
。 禁用APC,或运行PHP-FPM。
使用Fcgi,每个PHP进程都有自己的APC操作码caching。 对所有PHP进程使用FPM来共享一个公共caching。 或者禁用APC。 你似乎并不需要它(一个操作码caching比内存使用率更有效地降低CPU使用率))