内存不是大水漫灌:玩转 openEuler 的内核级内存精细化控制【华为根技术】

举报
Echo_Wish 发表于 2025/05/18 14:14:13 2025/05/18
【摘要】 内存不是大水漫灌:玩转 openEuler 的内核级内存精细化控制

内存不是大水漫灌:玩转 openEuler 的内核级内存精细化控制


很多朋友在用 Linux 做系统优化、容器编排的时候,经常有个误区:**内存有就用呗,管那么多干啥?**结果内存爆了,进程 OOM,被打懵的那个就是你自己。

尤其是在 openEuler 这类定位于“云-边-端”全场景操作系统的环境中,如果你还用“大锅饭”的方式管内存,那你离线上工单、KPI告急也就不远了。

今天咱就来聊聊:在 openEuler 中,如何实现内核级别的“内存精细控制”?

不是讲虚的,全程接地气、有例子、有实战,还带点个人的血泪教训。


一、为什么内存精细化控制这么重要?

我们常说“操作系统的三大核心管理能力:进程、内存、文件系统”。

进程可以用 top 监控,文件系统靠 IO 调度调优,但内存这玩意最迷了——

你可能一觉醒来发现系统挂了,再查日志一看:OOM Killer 把业务主进程干掉了,原因是某个边缘服务偷偷吃了几 G 内存。

内存这种“软性资源”,不管就乱,越管越顺。

特别是在下面几种典型场景中,内存精细控制简直就是“保命操作”:

  • 容器化部署:多个服务抢内存,某个占用过高会拖垮整机。
  • 边缘计算设备:本来资源就紧,不能任由内存暴涨。
  • 大数据任务调度:需要动态调整内存参数来适配不同 workload。

openEuler 提供了一整套从内核参数、cgroup 到 NUMA 策略的精细化工具,接下来逐个给你剖开说。


二、内核调参,稳住内存基本盘

openEuler 是基于 Linux Kernel 深度定制的版本,因此很多内存管理手段和内核参数是一脉相承的。

1. vm.swappiness:内存和交换空间谁先用?

# 查看当前 swappiness 值
cat /proc/sys/vm/swappiness

# 修改为10,表示尽量使用物理内存,不轻易swap
sysctl -w vm.swappiness=10

个人感受:swappiness 默认值太激进(60),在 openEuler 上会导致部分服务频繁swap。尤其是 Redis、Nginx 这类对内存访问速度要求高的服务,建议手动调低。


2. vm.overcommit_memory:到底要不要超配内存?

# 设置为2,禁止内核过度分配内存
sysctl -w vm.overcommit_memory=2

搭配使用 vm.overcommit_ratio 控制允许的最大内存分配比例。

sysctl -w vm.overcommit_ratio=80

这样可以防止 Java 程序申请几十 G 内存最后只用一丢丢,浪费系统资源。


三、cgroup:用“铁笼子”关住内存怪兽

cgroup(Control Group)是 Linux 控制资源的核心工具,在 openEuler 上也被用来限制容器或进程的资源使用。

以 systemd 启动服务为例,你可以直接配置服务的内存限制:

# /etc/systemd/system/myapp.service
[Service]
MemoryMax=512M

或者使用命令行方式:

# 创建一个cgroup并限制内存
cgcreate -g memory:/echo_group
echo $((512*1024*1024)) > /sys/fs/cgroup/memory/echo_group/memory.limit_in_bytes

然后把你的进程绑进去:

echo <pid> > /sys/fs/cgroup/memory/echo_group/tasks

这样,即使程序内存泄露了,也不会影响其他服务,cgroup直接兜底兜住了


四、NUMA优化:多核多内存也要“对症下药”

如果你是在 openEuler 的服务器或 AI 芯片上跑服务,很可能就是 NUMA 架构(非一致性内存访问)。

这时候,你还得关注内存访问的亲和性问题。

检查 NUMA 拓扑

lscpu | grep "NUMA"

你可能看到:

NUMA node(s):        2
NUMA node0 CPU(s):   0-7
NUMA node1 CPU(s):   8-15

numactl 控制内存亲和性

# 指定绑定到NUMA node 0执行
numactl --cpunodebind=0 --membind=0 ./myapp

如果你不做绑定,程序可能在 node0 上运行,却从 node1 拉内存,性能直接损失一半都不止


五、实战小案例:限制日志分析服务的内存

假设你在 openEuler 上跑一个 Python 写的日志分析程序,经常吃内存吃到 2GB 以上,影响其他服务。

步骤:

  1. 创建 cgroup:
cgcreate -g memory:/logcheck
  1. 设置限制为 512M:
echo $((512*1024*1024)) > /sys/fs/cgroup/memory/logcheck/memory.limit_in_bytes
  1. 启动程序并绑定:
cgexec -g memory:logcheck python3 log_check.py

一旦程序爆了 512M,就会被 OOM Killer 干掉,但其他业务都安然无恙。这不就是我们说的“精细化”?有种“坐在副驾驶还能遥控刹车”的感觉。


六、我的经验之谈:不要等系统报警才去优化内存

说点心里话。

我曾经在生产环境踩过一次坑:容器服务都正常,但主机变慢如乌龟,查了半天才发现 swap 用爆,硬盘在疯狂 page in/out。

后来才明白:内存精细管理,不是“出了问题再救火”,而是“预设防线,未雨绸缪”

尤其是 openEuler 这种定位于企业级、核心场景的系统,你要是真敢放任内存随意增长,那是给自己埋雷。


七、写在最后:内存调优,是“黑科技”更是“好习惯”

openEuler 给了我们足够多的武器,关键看你会不会用。

我始终相信:内存调优不是玄学,它和写代码一样,是种工程思维,更是一种习惯。

别等内存炸了再去网上搜“Linux 怎么防 OOM”,早点学点“干中带细、稳中带狠”的 openEuler 内存管理,才是真本事。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。