实用服务器内存优化:老站长踩坑攒出来的干货
上周帮一个做外贸独立站的朋友排障,他刚买的16G内存服务器,不到三天就爆了,网站卡成PPT,后台都登不进去。我上去一看,好家伙,PHP进程堆了快一百个,MySQL开了满配缓存,连没用到的闲置扩展都挂着。很多站长买服务器的时候,总想着能省则省,买刚好够的配置,结果用不了半个月就内存报警。与其月月加钱升配置,不如先做做内存优化,挤挤油水,大部分中小站其实能省出三分之一甚至一半的内存。
先搞清楚:你的内存到底被谁吃了
新手最爱犯的错,上来就瞎调参数,连谁占了内存都没搞清楚。
很多人用top,或者面板看内存,一看到used占了八九十,直接慌了。其实Linux天生就会把空闲内存拿来做文件缓存,这部分是可以随时释放给应用用的,不是真的被占了。要看真正可用的内存,得看available那栏,别盯着used瞎焦虑。
https://obgeo.oss-cn-beijing.aliyuncs.com/pvc-articles/ed6cac86-463d-49f4-8352-98c72fdd85d8.jpg
Linux服务器htop内存占用查看界面
我见过最离谱的操作,有人看到缓存占了好几个G,特意写了个定时任务每隔一小时清一次缓存,反而把系统性能搞垮了——你清了缓存,系统又要重新读磁盘存缓存,白白浪费IO和内存,这不瞎折腾吗。
真正要找的,是那些持续占着内存不释放的僵尸进程,还有你根本没用到却默认开机启动的服务。比如面板自带的网站监控、垃圾清理、安全扫描,很多都是用一次就一直挂着,能吃掉大几百M的内存,没用直接关。
常用服务的内存裁剪技巧
大部分站长用的都是LNMP或者面板环境,核心吃内存的就是三个:PHP、Nginx、MySQL,一个个说。
先说PHP,这货是小内存服务器的头号杀手。很多人用默认的动态进程管理,空闲的时候也挂着十几个二十个进程,每个进程占二三十M,积少成多就没了。如果你的站流量不是一直满负荷,直接把PHP进程模式改成ondemand,空闲的时候进程会自动释放,只有来请求了才新建进程,一下子能省出好几百M。最大进程数别瞎开,按照你的总内存算,每个进程留30M,1G内存最多开10个,2G开20个,别开几十上百个,撑爆了活该。
再说Nginx,很多教程说worker_processes要改成auto,适配CPU核心数。这话对大服务器没错,对你1G2G的小轻量服务器就是毒药。核心多开的进程多,每个进程占十几M,8核心就开8个,其实小站两个足够用,多余的都是占着内存浪费。另外把keepalive_timeout从默认的65秒改成15秒,超时自动释放连接,别让闲置连接占着内存。
最后说MySQL,这绝对是内存吞噬大户。默认配置根本不是给中小站准备的,innodb_buffer_pool_size默认直接占一半系统内存,你16G内存直接给你开8G,你一个一天几千IP的博客站,要这么大缓存干嘛?留1-2G足够跑了。老版本MySQL一定要关掉查询缓存,不仅占内存还拖慢查询速度,8.0以后默认删掉了倒是不用管。不用的扩展、不用的存储引擎,能关就关,又能省出小几百M。
https://obgeo.oss-cn-beijing.aliyuncs.com/pvc-articles/c6fa46d1-adfd-4602-9c64-8708e0d0e873.jpg
服务器PHP-FPM进程内存占用统计
我之前接过一个客户,自己照着网上的“优化教程”瞎调,把innodb_buffer_pool开成了12G,结果服务器总共才8G内存,直接把swap打满,网站打开要一分钟,客户还以为被黑客攻击了,我上去改完参数,内存直接剩出来5G,哭笑不得。
进阶优化:这些技巧能再省出一块内存
https://obgeo.oss-cn-beijing.aliyuncs.com/pvc-articles/8989cb2b-1dab-405d-9bf2-61b0b2ef4214.jpg
进阶优化:这些技巧能再省出一块内存
很多人谈swap色变,说用swap会让服务器变卡。说实话,对小内存服务器来说,合理开swap就是救命的。只要你不是天天把swap占满,开个1-2G当备用,比内存爆了强行杀进程强太多。我手里七八个小流量站,都是1G内存的轻量服务器,开了1G swap,跑了三四年,啥问题没有。
如果你用的是PHP7.4以上,一定要开PHP预加载。现在主流框架比如Laravel、ThinkPHP都支持预加载,把框架核心文件提前加载到内存里,多个请求共享这一块内存,不用每次请求都重新读取解析,单个进程的内存占用能降10%-20%,同时访问速度还更快,等于赚了两头便宜。
用Redis做缓存的朋友,别忘了设置maxmemory和淘汰策略。很多人装完Redis就不管了,时间长了各种冷数据堆在内存里,越占越多,最后直接爆内存。给Redis设置个内存上限,比如最多用1G,开volatile-lru淘汰策略,不用的冷键自动清掉,一直稳在安全线以内。
不过话说回来,优化不是无限的。要是你的流量真的起来了,一天几万几十万IP,该加内存就加内存,别抠抠搜搜在那抠那几百M。我之前就犯过这个错,舍不得每个月多花几十块钱升配置,天天抠优化,结果网站卡了一周,关键词排名掉了一半,后来花了三个月才慢慢涨回来,亏的比那点服务器钱多太多了。
优化就是抠细节,踩的坑多了,自然就知道哪能挤出来内存,哪不能瞎动。就这样。 思路很清晰,步骤也很详细,跟着操作应该不会出什么问题。 很多建议都很接地气,能直接用在生活或工作中,实用性很强。 认真看完了整篇内容,感觉受益匪浅,期待楼主后续更多优质的分享。 看完很有启发,也引发了我不少思考,有空也想分享下自己的看法。 楼主的经历很有参考价值,给了我很多新的思考方向,非常感谢。 帖子内容很扎实,不浮夸不炒作,真正有用的信息都在里面。 内容全面又细致,几乎把相关问题都覆盖到了,非常用心。 虽然篇幅不长,但句句都是重点,简洁又有深度,非常不错。
页:
[1]