Linux采用虚拟内存管理系统,将物理内存和交换空间(Swap)统一管理。主要特点包括:
ulimit命令:设置用户或进程资源限制
ulimit -v 2097152 # 限制虚拟内存为2GB
cgroups控制组:更精细的内存控制
# 创建内存限制组
cgcreate -g memory:batch_group
# 设置内存限制为1GB
echo 1G > /sys/fs/cgroup/memory/batch_group/memory.limit_in_bytes
# 将进程加入控制组
cgexec -g memory:batch_group ./batch_job.sh
nice/renice:调整进程优先级
nice -n 19 ./batch_job.sh # 最低优先级
ionice:调整I/O优先级
ionice -c 3 ./batch_job.sh # 空闲时I/O
free:查看内存使用概况
free -h
vmstat:监控虚拟内存统计
vmstat 1 # 每秒刷新一次
top/htop:实时进程监控
top -o %MEM # 按内存使用排序
pmap:查看进程内存映射
pmap -x <PID>
分块处理:将大数据集分成小块处理
# 示例:分块处理大文件
split -l 1000000 large_file.txt chunk_
for file in chunk_*; do
process_chunk "$file"
done
内存释放:及时释放不再使用的变量
unset large_variable
使用临时文件:避免在内存中保存大量数据
temp_file=$(mktemp)
process_data > "$temp_file"
限制子进程内存:在并行处理时控制每个子进程内存
# 使用xargs限制并行度
find . -name "*.dat" | xargs -P 4 -n 1 process_file
提高大内存应用的性能:
# 查看大页配置
cat /proc/meminfo | grep Huge
# 预留大页(需要root)
echo 20 > /proc/sys/vm/nr_hugepages
使用压缩内存作为交换空间:
# 启用zram
modprobe zram
echo lz4 > /sys/block/zram0/comp_algorithm
echo 2G > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon /dev/zram0
配置OOM killer行为:
# 调整进程的OOM得分(值越高越容易被kill)
echo 100 > /proc/<PID>/oom_score_adj
#!/bin/bash
# 设置内存限制(2GB虚拟内存)
ulimit -v 2097152
# 使用cgroups限制内存为1.5GB
if [ -d /sys/fs/cgroup/memory/batch_jobs ]; then
echo 1610612736 > /sys/fs/cgroup/memory/batch_jobs/memory.limit_in_bytes
echo $$ > /sys/fs/cgroup/memory/batch_jobs/cgroup.procs
fi
# 监控内存使用
monitor_memory() {
while true; do
mem_usage=$(pmap -x $$ | tail -1 | awk '{print $3}')
echo "Memory usage: $((mem_usage/1024)) MB"
sleep 10
done
}
# 后台运行内存监控
monitor_memory &
# 主处理逻辑
process_large_dataset() {
# 分块处理数据
for chunk in $(seq 1 10); do
# 处理前检查可用内存
available_mem=$(free -m | awk '/Mem:/ {print $7}')
if [ $available_mem -lt 500 ]; then
echo "警告: 可用内存不足500MB,暂停处理"
sleep 60
fi
process_data_chunk $chunk
# 显式释放资源
unset temp_data
done
}
process_large_dataset
# 清理
kill %1 # 停止监控进程
通过以上方法和工具,可以有效地管理和优化Linux系统中批处理任务的内存使用,确保系统稳定性和任务执行效率。