在Linux系统中,内存使用确实可能受到多种因素的限制。以下是详细分析和解决方案:
/proc/sys/vm/overcommit_memory
控制内存分配策略:
0
(默认):允许适度超分配,依赖OOM Killer终止进程。1
:总是允许超分配,高风险。2
:禁止超过CommitLimit
(由overcommit_ratio
或/proc/sys/vm/overcommit_kbytes
定义)。
bash
# 查看当前设置
cat /proc/sys/vm/overcommit_memory
# 临时修改(需root)
echo 2 > /proc/sys/vm/overcommit_memory
ulimit:限制用户或进程的内存使用。
# 查看当前限制(单位:KB)
ulimit -v # 虚拟内存
ulimit -m # 物理内存(通常无效,因Linux少用此限制)
# 临时设置(如限制为2GB)
ulimit -v 2097152
/etc/security/limits.conf
:username hard as 2097152 # 用户硬限制
* soft memlock 1048576 # 所有用户的软锁内存限制
cgroups (v2):更精细的资源控制(容器常用)。
# 创建cgroup并限制内存为1GB
mkdir /sys/fs/cgroup/memory/mycgroup
echo 1G > /sys/fs/cgroup/memory/mycgroup/memory.limit_in_bytes
# 将进程加入cgroup
echo <PID> > /sys/fs/cgroup/memory/mycgroup/cgroup.procs
-m
或--memory
参数限制。
bash
docker run -it --memory="2g" ubuntu /bin/bash
resources.limits
。
yaml
resources:
limits:
memory: "1Gi"
0-100
)。
bash
echo 10 > /proc/sys/vm/swappiness # 降低交换倾向
/proc/<pid>/oom_score_adj
调整进程被终止的优先级(-1000
到1000
)。bash
free -h # 查看内存总量及使用情况
top/htop # 进程级内存占用
vmstat 1 # 虚拟内存统计
bash
dmesg | grep -i oom # 查看OOM事件记录
oom_score_adj
。Linux内存限制可通过系统参数、用户权限、cgroups和容器配置等多层面控制。根据场景选择合适方案,并结合监控工具动态调整。