Linux内存管理是一个复杂而高效的子系统,负责管理物理内存和虚拟内存资源。它主要包括以下几个核心功能:
在Linux中,每个进程都有自己独立的虚拟地址空间,32位系统通常是4GB,64位系统则大得多。这个空间分为:
Linux使用页表将虚拟地址转换为物理地址,转换过程如下:
用于管理物理页面的分配和回收,主要特点:
建立在伙伴系统之上,用于内核对象的高效分配:
每个进程都有一个mm_struct,包含:
struct mm_struct {
struct vm_area_struct *mmap; // 虚拟内存区域链表
pgd_t *pgd; // 页全局目录
atomic_t mm_users; // 使用该地址空间的用户数
atomic_t mm_count; // 对mm_struct的引用计数
unsigned long total_vm; // 映射的总页数
// ... 其他字段 ...
};
描述进程地址空间中的一个连续区域:
struct vm_area_struct {
struct mm_struct *vm_mm; // 所属的内存描述符
unsigned long vm_start; // 区域起始地址
unsigned long vm_end; // 区域结束地址
struct vm_area_struct *vm_next; // 链表中的下一个VMA
pgprot_t vm_page_prot; // 访问权限
unsigned long vm_flags; // 标志位
// ... 其他字段 ...
};
Linux使用页面缓存来提高文件I/O性能:
当物理内存不足时,Linux会将不常用的页面换出到交换空间:
free
: 查看内存使用情况vmstat
: 虚拟内存统计top/htop
: 进程内存使用监控pmap
: 查看进程内存映射slabtop
: 查看slab分配情况/proc/meminfo
: 详细内存信息/proc/<pid>/maps
: 进程内存映射/proc/<pid>/smaps
: 详细内存使用统计/proc/buddyinfo
: 伙伴系统信息/proc/slabinfo
: slab分配器信息调整swappiness值:
echo 10 > /proc/sys/vm/swappiness
使用hugepages减少TLB miss:
echo 20 > /proc/sys/vm/nr_hugepages
优化页面回收策略:
echo 1 > /proc/sys/vm/drop_caches
限制进程内存使用:
ulimit -v 500000 # 限制虚拟内存为500MB
使用cgroups进行内存限制:
cgcreate -g memory:/mygroup
echo 100M > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
valgrind --tool=memcheck
检测用户空间泄漏kmemleak
检测内核空间泄漏/proc/meminfo
中的Slab
和SUnreclaim
值当系统内存严重不足时,OOM Killer会终止进程。可以通过以下方式调试:
/var/log/messages
中的OOM日志/proc/<pid>/oom_score
和/proc/<pid>/oom_score_adj
/proc/sys/vm/panic_on_oom
控制OOM行为Linux内存管理系统是一个高度优化的复杂子系统,理解其工作原理对于系统调优和问题排查至关重要。通过合理配置和监控,可以显著提高系统性能和稳定性。