在Linux系统中,有多种方法可以限制和控制进程对系统资源的使用。以下是主要的资源控制方法和工具:
ulimit
是bash内置命令,用于限制当前shell及其子进程的资源使用。
ulimit -a # 显示所有当前限制
ulimit -u # 限制用户最大进程数
ulimit -n # 限制打开文件描述符数量
ulimit -v # 限制虚拟内存大小(KB)
ulimit -m # 限制物理内存大小(KB)
ulimit -t # 限制CPU时间(秒)
编辑/etc/security/limits.conf
文件:
* hard nofile 4096 # 所有用户最大文件数
username soft nproc 100 # 用户username最大进程数
@groupname hard cpu 5000 # groupname组CPU时间限制
cgroups是Linux内核功能,提供更精细的资源控制。
# 创建一个slice
systemctl set-property user-1000.slice CPUQuota=50% MemoryLimit=1G
# 查看cgroup设置
systemd-cgls
systemd-cgtop
# 挂载cgroup2文件系统
mount -t cgroup2 none /sys/fs/cgroup
# 创建子cgroup
mkdir /sys/fs/cgroup/mycgroup
# 设置限制
echo "100000" > /sys/fs/cgroup/mycgroup/cpu.max
echo "500M" > /sys/fs/cgroup/mycgroup/memory.high
# 将进程加入cgroup
echo $$ > /sys/fs/cgroup/mycgroup/cgroup.procs
调整进程优先级:
nice -n 19 command # 以最低优先级启动命令
renice 10 -p 1234 # 改变已运行进程(pid=1234)的优先级
限制进程的CPU使用率:
cpulimit -l 50 -p 1234 # 限制pid=1234的进程最多使用50%CPU
cpulimit -l 30 -e firefox # 限制firefox进程最多使用30%CPU
# 创建内存限制组
cgcreate -g memory:myapp
# 设置内存限制为1GB
cgset -r memory.limit_in_bytes=1G myapp
# 运行应用程序
cgexec -g memory:myapp mycommand
编辑服务文件(/etc/systemd/system/myservice.service
):
[Service]
MemoryLimit=1G
CPUQuota=50%
控制磁盘I/O优先级:
ionice -c 3 -p 1234 # 设置pid=1234为idle I/O级别
ionice -c 2 -n 7 command # 以best-effort级别(7)运行命令
使用Docker时:
docker run --cpus=".5" --memory="512m" image_name
使用LXC时:
lxc config set mycontainer limits.cpu 2
lxc config set mycontainer limits.memory 1GB
/etc/security/limits.conf
通过合理使用这些工具和技术,可以有效防止单个进程或用户占用过多系统资源,保证系统的稳定性和公平性。