当前位置: 首页 > article >正文

为什么 Docker 建议关闭 Swap

在使用 Docker 时,关闭系统 Swap(交换分区) 是一个常见的推荐做法,尤其是在生产环境中。虽然 Docker 不强制要求禁用 Swap,但出于性能、稳定性、可控性和资源管理的目的,通常建议这样做。


为什么 Docker 建议关闭 Swap?

1. 避免容器“假性内存不足”导致的性能问题

  • 当系统内存不足时,Linux 会将部分内存数据交换到磁盘上的 Swap 分区。
  • 这会导致严重的性能下降,尤其是对于容器这种对响应时间敏感的应用。
  • 容器本应是轻量级、高性能的运行环境,Swap 的存在会破坏这一特性。

类比理解:就像你把工作台塞满了工具箱,没地方放新工具了,就把一些旧工具搬到地下室去。每次要用就得跑一趟地下室,效率大大降低。


2. 与 Linux OOM Killer 行为冲突

  • Docker 和 Kubernetes 都依赖 Linux 内核的 Memory Cgroup 来设置容器的内存限制。
  • 如果启用了 Swap,内核就无法准确判断一个容器是否真的超出了内存限制。
  • 这可能导致:
    • OOM Killer 错误地杀死重要进程
    • 超出内存限制的容器未被限制住,影响其他容器或系统稳定性。

3. 更精确控制资源隔离和调度

  • Docker 的目标之一是提供可预测的资源控制。
  • 启用 Swap 会让资源控制变得不可控,比如:
    • 一个设置了 --memory=2G 的容器,可能实际使用超过 2G(包含 Swap)。
    • 影响调度器(如 Kubernetes)对节点资源的判断。

4. Kubernetes 默认不支持 Swap(直到 v1.22+ 支持但默认仍禁用)

  • 在 Kubernetes 中,从 v1.22 开始才正式支持启用 Swap,但仍需要手动开启功能开关(如 NodeSwap: Enabled)。
  • 大多数生产部署仍然默认禁用 Swap。

实际表现差异(有无 Swap)

场景启用 Swap禁用 Swap
内存不足尝试换出内存页到磁盘直接触发 OOM Killer 或拒绝启动容器
性能可能变慢、延迟高更快、更稳定
资源控制不准确准确

如何查看和关闭 Swap

查看当前 Swap 使用情况:

free -h
swapon --show

临时关闭 Swap(立即生效,重启失效):

sudo swapoff -a

永久关闭 Swap(修改配置文件):

编辑 /etc/fstab 文件,注释掉含有 swap 的行:

# /etc/fstab
# UUID=... none swap sw 0 0

然后执行:

sudo swapoff -a

📌 总结

项目是否推荐关闭 Swap
Docker 生产环境推荐关闭
测试环境/内存充足可保持启用(用于调试或开发)
Kubernetes 集群节点推荐关闭(尤其在 v1.22 之前)

补充建议

  • 如果运行在云平台(如阿里云 ACK、AWS EKS),很多托管 Kubernetes 服务默认已经关闭了 Swap。
  • 如果确实需要 Swap,请确保:
    • Swap 性能足够好(SSD)
    • 设置合理的 vm.swappiness(通常设为 0~10)

在搭建生产级别的 Docker/Kubernetes 环境时,建议一开始就关闭 Swap,并通过监控手段确保有足够的物理内存。这样可以获得更一致、可控和稳定的运行体验。

http://www.lryc.cn/news/2379526.html

相关文章:

  • 缓存的相关内容
  • [ctfshow web入门] web77
  • C++学习-入门到精通-【7】类的深入剖析
  • API 加速方案:如何使用 Redis 与 Memcached 进行高效缓存优化
  • 主成分分析的应用之sklearn.decomposition模块的PCA函数
  • 1. Go 语言环境安装
  • IP协议深度解析:互联网世界的核心基石
  • Oracle DBMS_STATS.GATHER_DATABASE_STATS 默认行为
  • C++天空之城的树 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • HTTP 请求走私(HTTP Request Smuggling)
  • 基于WebRTC的实时语音对话系统:从语音识别到AI回复
  • typeof运算符和深拷贝
  • .Net HttpClient 使用 Cookie
  • Python爬虫实战:通过PyExecJS库实现逆向解密
  • Java中的伪共享(False Sharing):隐藏的性能杀手与高并发优化实战
  • GO语言语法---switch语句
  • 开疆智能Profient转ModbusTCP网关连接ABB机器人MODBUS TCP通讯案例
  • 解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
  • 【洛谷P3386】二分图最大匹配之Kuhn算法/匈牙利算法:直观理解
  • Text2SQL:自助式数据报表开发---0517
  • 使用Visual Studio将C#程序发布为.exe文件
  • 写spark程序数据计算( 数据库的计算,求和,汇总之类的)连接mysql数据库,写入计算结果
  • React Flow 边的基础知识与示例:从基本属性到代码实例详解
  • oracle 资源管理器的使用
  • 新手入门系列-linux系统下安装和使用docker
  • mysql中4种扫描方式和聚簇索引非聚簇索引【爽文一篇】
  • 贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现
  • 水平可见直线--上凸包(andrew算法
  • 【mysql】并发 Insert 的死锁问题 第二弹
  • Docker配置SRS服务器 ,ffmpeg使用rtmp协议推流+vlc拉流