128G内存服务器建议配置16-32G swap分区;如果跑数据库或内存型应用就按需上调,纯Web集群甚至可以直接关闭swap,没有一刀切的答案,关键看业务场景和内核参数调优。
swap在128G内存服务器上的真实作用
很多运维新手有个根深蒂固的认知:内存越大,swap就要越大,这个观念源自早年物理内存只有几百兆的时代,当年Linux官方文档确实建议swap设为物理内存的1-2倍,但放在128G内存的服务器上,这套理论已经完全过时了。
现代Linux内核的内存管理策略早已改变,当物理内存充足时,系统的page cache会充分利用闲置内存来加速磁盘IO,而不是像老内核那样急着把数据往swap里赶,128G内存的机器上,大部分业务连物理内存的一半都用不到,这时候再划出一个128G甚至256G的swap分区,纯粹是浪费磁盘空间一块企业级SSD的价格并不便宜,而那块swap分区可能一年到头都用不上几个G。
swap彻底不配也是一种极端思路,所有内存页都锁死在物理内存里,一旦遇到突发流量导致内存见顶,内核的OOM Killer就会开始随机杀进程,那种事故在线上环境经常是致命的,swap的正确角色是安全垫,不是主存储,128G内存的机器,给系统留个能缓冲突发内存压力的swap大小,才是合理思路。
业内通行的做法是:先用一个小swap兜底,再把内核参数vm.swappiness调低,让系统只在物理内存真正紧张时才动用swap,这个组合拳能同时兼顾性能和安全性,据Linux kernel社区公开的文档和各大云厂商的运维白皮书,这套配置在128G内存这个容量级已经是标准操作。
128G内存服务器swap分区推荐值
通用生产环境:16-32G
多数企业的128G服务器是跑Web应用、API服务、容器集群的,这类场景的特点是:稳定态内存占用通常在20-40G之间,但遇到流量高峰或代码内存泄漏时,内存会快速攀升。
推荐配置:swap设置为16G-32G,16G适合那些内存管理已经做得比较精细的Java或Go应用,32G适合跑微服务集群、K8s节点这类吃内存的负载,在这个区间内,swap能够覆盖突发流量导致的内存缺口,同时不至于让磁盘空间被白白吃掉。
实操命令(在已运行的Linux系统上增加swap):
# 创建swap文件(以16G为例) fallocate -l 16G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写入fstab实现开机自动挂载 echo '/swapfile none swap sw 0 0' >> /etc/fstab
数据库服务器:30-64G
跑MySQL、PostgreSQL、Oracle这类关系型数据库的128G服务器,swap策略要保守一些,数据库进程对内存的占用是动态的,InnoDB缓冲池、排序缓冲、连接线程都会按需吃内存,一旦内存耗尽,数据库进程被内核杀掉,后果是整个业务链路宕机。
推荐配置:swap设置为32G-64G,具体大小参考数据库缓冲池配置:如果InnoDB buffer pool已经分配了64G,建议swap配到48G以上;如果缓冲池只占32G,swap配32G也够用。
还有一个容易被忽略的点:数据库服务器的磁盘IO已经很繁忙,swap文件的读写会加剧磁盘压力,因此数据库服务器建议用独立的swap分区而非swap文件,把swap分区放在单独的磁盘上,减少IO争抢。
内存密集型应用:0-16G
跑Redis、Memcached、Elasticsearch这类本身就是用内存换性能的应用,swap的态度要反过来,这些应用的设计前提是数据全部驻留内存,一旦部分内存页换到swap,命中率暴跌,延迟可能从微秒级恶化到毫秒级甚至秒级。
推荐配置:swap设置为0-16G,纯缓存节点建议直接关闭swap(swapoff -a),让OOM Killer去处理极端情况下的进程清理,至少它会杀掉异常的进程而非拖垮整个服务的性能,Elasticsearch官方部署建议明确推荐:关闭swap(在jvm.options中设置bootstrap.memory_lock: true),强制JVM锁住物理内存。
云服务器与裸金属设备的差异
抛开业务场景谈swap都是耍流氓,跑在物理机上的业务,swap建议按上述规则配置,但如果是云服务器,情况有所不同,云厂商的虚拟机文件系统本身就是分布式的,swap文件的读写会经过宿主机存储层,性能损耗比物理机更大,云上128G内存的实例,swap可以适当调小6-8G,配合云厂商官网给出的内核参数调整命令来做,据部分云厂商公开的性能测试数据,云盘型swap的随机读写延迟是本地SSD的数倍,这意味着当swap被频繁访问时,业务性能会明显劣化。
内核参数vm.swappiness的调优:比swap大小更重要的一环
很多文章只讲swap分多大,却忽略了swappiness这个内核参数,它直接决定了系统使用swap的倾向程度,取值范围0-100,数值越高,内核越倾向于把不活跃的内存页换到swap;数值越低,则倾向于保留在物理内存中。
128G内存的服务器,推荐把vm.swappiness设为1-10,为何不是0?因为设置为0在某些旧版内核中会触发极端行为:内核几乎完全不使用swap,导致文件缓存无法及时回收,反而影响性能,设为1到10,既能保证紧急时刻有swap兜底,又不会让系统在物理内存还有很多剩余时频繁使用swap。
修改方法:
# 查看当前值 sysctl vm.swappiness # 临时修改为10 sysctl vm.swappiness=10 # 永久修改 echo 'vm.swappiness=10' >> /etc/sysctl.conf sysctl -p
有些内核版本还支持vm.vfs_cache_pressure参数的调整,它可以控制内核回收inode和dentry缓存的速度,默认值100,对于128G内存的服务器可以下调到50左右,让文件系统缓存更持久地保留在内存中,减少磁盘IO。
在已运行的服务器上增加swap:三步实操
很多人拿到服务器以后才发现swap没配够,这时候不用重装系统,按下面步骤操作即可。
第一步:确认当前swap状态
free -h swapon --show
第二步:创建swap文件或分区
注意,swap文件比swap分区更灵活,不需要额外划分磁盘空间,随时可以删除重建,操作:
# 创建4G swap文件 dd if=/dev/zero of=/swapfile bs=1M count=4096 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
chmod 600这步绝不能省略,swap文件包含内存页数据,如果权限是默认的644,任何用户都能读取,相当于把服务器内存里的敏感数据暴露给了普通用户。
第三步:验证并写入开机自动挂载
# 验证swap已生效 swapon --show # 写入fstab echo '/swapfile none swap sw 0 0' >> /etc/fstab
swap使用率监控与故障排查
swap配置好以后,不是一劳永逸的事,线上服务器需要持续监控swap使用情况。
监控工具与命令
free -h:查看swap总容量和已用容量vmstat 1:实时查看si(swap in)和so(swap out)两列,如果这两个数字持续高于几十,说明swap被频繁使用,物理内存已经吃紧,反过来,如果si和so长期为零,说明swap根本没在干活,但这也意味着物理内存充足,系统处于健康状态。sar -S 1:查看swap使用率的历史趋势,据系统性能分析工具sysstat的官方文档,sar -S能输出pswpin/s和两个指标,分别代表每秒从swap读入和写入内存的页数。pswpout/s
多数时候,如果swap占用率达到70%以上且持续不下降,这时候不要急着扩大swap,反而应该检查物理内存是否泄漏,用top按内存占用排序,找到领导进程,分析是代码问题还是流量上升导致的真实需求增长,如果确认业务量确实涨了,再考虑扩内存或者换更大规格的服务器,盲目把swap扩大,只会掩盖问题,透支性能。
故障排查示例
生产环境报错cannot allocate memory时,第一件事不是急着调swap,而是看dmesg的输出:
dmesg -T | tail -50 grep -i "out of memory" /var/log/messages
如果出现大量的OOM kill记录,说明swap和物理内存都到了极限,需要扩容,如果报错只是某个进程无法申请内存但系统空闲内存还有不少,很可能是因为vm.max_map_count或ulimit限制,这时候调swap是没用的。
常见问题速答
128G内存的服务器,swap分8G够吗?
取决于业务,如果只是跑Nginx反向代理和几个Java微服务,8G作为安全垫够用,但如果跑数据库或大数据类任务,8G明显偏小,突发流量下很容易触发OOM,建议按照上面分场景的建议来,通用场景16G起步是稳妥选择。
128G内存的服务器可以不分swap吗?
可以,但要满足两个前提:这类服务器跑的是纯内存型应用,且业务方接受极端情况下进程被OOM Killer清理,例如Redis缓存节点、Elasticsearch数据节点,这类场景中,禁用swap是为了保住性能下限,而不是出于节省空间的考虑。
swap文件放在哪个磁盘上性能最好?
放在最快的独立磁盘上,理想情况是NVMe SSD单独划一个分区给swap,不要和系统盘、数据盘混在一起,如果是云服务器,优先选择本地SSD实例而非云盘实例,因为本地SSD的延迟和吞吐量都优于网络存储,以酷番云等持牌IDC服务商的实践来看,其物理机产品线通常会在系统盘中预留单独的swap分区,用户入手后无需额外配置即可直接部署业务,赤兔云也有类似做法。
128G内存服务器的swap配置,说到底就是在磁盘空间、突发兜底和性能三者之间找平衡,通用场景16-32G,数据库场景32-64G,内存型应用0-16G,再配合vm.swappiness=10的调优,这套组合能覆盖绝大多数生产环境的需求,swap是保险丝,不是备用电源,分多大的价值远不如监控做得好选个靠谱的机房服务商,把系统基础参数调优到位,剩下的交给监控和告警系统去盯。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/700786.html





