Linux操作系统采用多层次的缓存体系来提高系统性能,主要包括:
struct address_space {
struct inode *host; // 所属inode
struct radix_tree_root page_tree; // 基数树存储页面
unsigned long nrpages; // 总页数
// ...
};
struct lruvec {
struct list_head lists[NR_LRU_LISTS];
// ...
};
enum lru_list {
LRU_INACTIVE_ANON = 0,
LRU_ACTIVE_ANON = 1,
LRU_INACTIVE_FILE = 2,
LRU_ACTIVE_FILE = 3,
LRU_UNEVICTABLE,
NR_LRU_LISTS
};
vm_area_struct
跟踪内存区域访问模式# 查看当前缓存设置
sysctl -a | grep vm
# 调整脏页回写阈值
echo 10 > /proc/sys/vm/dirty_background_ratio
echo 20 > /proc/sys/vm/dirty_ratio
# 调整swappiness(0-100)
echo 10 > /proc/sys/vm/swappiness
# 创建内存cgroup
cgcreate -g memory:myapp
# 限制缓存使用
echo 2G > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
# 查看THP状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 动态调整
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
pages_high > pages_low > pages_min
# 启用zswap
echo 1 > /sys/module/zswap/parameters/enabled
free -h # 查看内存使用概况
vmstat 1 # 监控虚拟内存统计
sar -r 1 # 内存使用率历史
# 查看页面缓存详细信息
cat /proc/meminfo
# 跟踪页面回收活动
echo 1 > /proc/sys/vm/vmstat_refresh
cat /proc/vmstat | grep pgscan
# 使用perf分析缓存命中率
perf stat -e cache-references,cache-misses <command>
# 使用bpftrace跟踪页面缓存
bpftrace -e 'kprobe:add_to_page_cache_lru { @[comm] = count(); }'
# 1. 减少swap使用
echo 1 > /proc/sys/vm/swappiness
# 2. 使用HugePages
echo 2048 > /proc/sys/vm/nr_hugepages
# 3. 调整IO调度器
echo deadline > /sys/block/sda/queue/scheduler
# 1. 增加脏页回写时间
echo 1500 > /proc/sys/vm/dirty_expire_centisecs
# 2. 调整inode缓存
echo 90 > /proc/sys/fs/inode_state
# 3. 预读优化
blockdev --setra 4096 /dev/sda
通过深入理解Linux缓存机制和替换算法,系统管理员和开发者可以针对特定工作负载进行精细调优,显著提升系统性能。实际应用中应根据具体场景进行基准测试和参数调整,找到最优配置。