您好!欢迎访问福玩代码!
广告位

服务器内存不够用?Swap优化与内存管理实战指南

栏目: 日期: 浏览:93

服务器内存爆满时,Swap到底该不该开

众多的站长对于Swap是那种既爱又厌恶,爱其原因在于它能够在内存处于不足的状况之时给予缓冲,讨厌的点则是一旦它被大量地运用,网站的响应速度就会直接出现崩盘的情况。实际上,Swap并非是那种像洪水猛兽一般的存在,关键的核心之处在于你是用怎样的方式去定义它的使用策略的。

请先弄明白一项原则:Swap属于内存的应急通道,并非替代品。在物理内存充足之际,Swap最好维持极低的使用率。然而在诸多服务器的默认配置状况下,Swap表现得过于积极,致使大量不常用的程序数据也霸占了交换空间,反倒拖累了IO。就Web服务器而言,Nginx、PHP-FPM这类核心服务的常驻进程应当被锁定在物理内存之中,不能轻易被Swap换出。

实践操作方面,在实际运用当中,我们一般是借助对vm.swappiness参数予以调整,以此来把控系统运用Swap的趋向,数值的范围处于0到100之间,数值越大就会越激进,对于配备SSD硬盘的服务器而言,建议设置为10或者更低;要是属于机械硬盘的话,能够适度调整到20左右。具体的修改方式是极为简便的,也就是对 /etc/sysctl.conf 展开编辑操作,接着添加 vm.swappiness=10 这一内容,随后借助执行 sysctl -p 来使相关设置生效。

还有一点容易被忽视:查看哪些进程在占用Swap。运用for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2"" $3}END{ print""}' $file; done | sort -k 2 -n -r | head -10这个指令,直接找出占用Swap较多的进程。要是察觉到是MySQL或者Redis的某些进程大量运用Swap这种情况,那就表明物理内存已然处于告急状态了,仅仅是调低swappiness这般做只能延缓该问题,而真正的解决办法是增加内存或者对业务层缓存策略予以优化。

内存管理优化:从监控到限流的一整套动作

搞清楚谁在吃内存,这永远是内存优化要迈出的第一步。不少站长装了宝塔或者面板后,就觉得一切都没问题了,然而面板仅仅能够看到总量,却没办法看到细节。你得借助htop或者nmon这类工具,实时去观察每个进程的内存变化情况。就好比PHP-FPM,它每个子进程的内存占用一般是在30至50MB之间,要是动态进程数设置得过高,内存会毫无预兆地被用光。

建议针对PHP - FPM去设置内存方面的硬限制,于php.ini之中,把memory_limit调整至128MB或者256MB便足够用了,并不需要给到512MB以上,与此同时,在PHP - FPM池的配置之内,依照服务器物理内存的总共数量以此反向推理最多可以有的子进程数量,公式是较为简单的,即max_children等于物理内存除以每个进程平均内存,之后再打个八折留出一定的余量。再比如说,内存为8GB,每个PHP进程算作40MB来考量。那么,将max_children设置成160的话,于这种情形下定会显得特别安全。

MySQL属于又一个内存消耗量大的东西,innodb_buffer_pool_size一般情况下建议被设置至物理内存的60% - 70%,不过要是你的网站属于像WordPress这样的动态类型站点,而且还运行着Redis缓存,那么这个比例需要适度地往下降,举个例子来说,8GB的服务器,Redis占用1GB,系统以及其他服务占用1.5GB,如此一来MySQL的缓冲池设置到4GB左右便大致可以了,剩余的1.5GB留给突发的流量以及系统缓冲。

存在这样一个实操方面的技巧,那就是每隔一定时间去清理内存缓存,尽管Linux自身会自行进行回收,然而有时候缓存会增大到对新进程启动造成影响的程度,可以借助 同步操作并输入echo 3 > /proc/sys/vm/drop_caches 来手动清理,不过要留意,此操作会将文件系统缓存清空,数据库读取可能会在短时间内变得缓慢,建议在业务处于低峰期的时候执行,就像在凌晨三点利用cron进行定时运行一次。

避坑指南:Swap和内存优化的常见误区

众多教程讲“彻底禁用Swap能够令网站更为快速”,这实际上是个陷阱。当你服务器的内存确实被占满之际,没有Swap的情况下,内核会直接触发OOM Killer,随机杀掉进程。你费尽心力运行的服务可能瞬间就挂掉。正确的做法是保留Swap,不过要让它仅作为最后一道防线。比如设置vm.swappiness=1,如此系统会优先运用物理内存,只有于内存真的告急之时才会写入Swap。

常见的另外一个误区是,盲目地对overcommit_memory进行调整。存在一些优化文章给出建议,将vm.overcommit_memory修改为2 ,如此一来内核会对内存分配作出严格限制。然而这样做对于数据库以及像PHP这类频繁进行内存申请与释放操作的服务而言,反倒并不友好 ,容易致使分配出现失败情况。除非你对自身所做之事极为清楚明白,不然就维持默认的0 ,不要去改动它。

容易存在且容易被忽略的一点是:不要忘掉去检查硬盘IO。Swap的读写速度直接是受限于磁盘性能的。要是你使用的是机械硬盘,一旦Swap被频繁地进行读写,那么整个服务器的响应时间将会飙升到让人无法接受的程度。在这种情形下,与其去调整Swap参数,倒不如先把关键的数据缓存到内存当中,比如说利用Redis去进行页面缓存,以此来减少后端的动态请求,从根源之处降低内存压力。http://www.fouwan.com