Unit 11 Memory Caches 内存缓存
学习目标:
A. 使用内存来改善运行慢的子系统的服务时间。
11.1 Strategies for using memory 内存使用策略
A. 减少内存使用者负载
a. slab cache 分配缓存
B. 减少或延时运行慢的子系统的服务时间
a. Filesystem metadata文件系统源数据:buffer cache(slab cache)
b. Disk IO: page cache
c. Interprocess communications进程间通信:shared memory共享内存
d. Network IO: buffer cache, arp cache, connection tracking
C. 调整内存要注意的:
a. 怎么样回收页面才能避免内存的压力
b. IO速度慢要怎么做?
1) 对于小的写入调整内存效果不是很明显
2) 对于大的数据写入使用重排序更有效。
影响磁盘IO最主要的因素是page cache.
11.2 A closer look at demand paging 页面调度
A. 只有进程要存储数据时才分配页面框给进程
a. 常驻页面是存放在主存(RAM)里面的
b. 非常驻页面是放在磁盘上面或者没在使用的。
B.允许内存过量使用系统内存
a. 对科学计算应用方面很有帮助。
b. 有利于执行程序与内存的地址参照
c. 当进程存储数据时不会用到Memory(RAM+swap).
11.3 Tuning page allocation 页面分配
A. 参数设置
vm.min_free_kbytes 内存最小保留空间
B. 运用
应用程序会不定期分配和使用大内存块。
C. 结论:
a. 减少页面调度的服务时间
b. 内存最小保留空间不能被其它程序使用。
c. 内存最小保留空间过大的话会给ZONE_NORMAL造成压力。
11.4 Tuning overcommit 调整overcommit
A. 参数设置
vm.overcommit_memory:
a. 0=henuristic overcommit 默认值,程序运行时如内存不够分配则拒绝并报警。
b. 1=always overcommit 应用程序要多少就分配多少,不管内存够不够。
c. 2=commit all swap plus a percentage of RAM (may be >100)
vm.overcommit_ratio 默认值为50, swp+RAM*50%
B. 在/proc/meminfo里查看committed_AS
作用:评估在当系统负载下需要多少内存以避免内存溢出。
C. 结论:
a. 允许内核满足对大虚拟地址空间的请求
b. 警告:当内存溢出或内存过量使用时进程会崩溃。
11.5 Slab cache 缓存分配
A. slab用来存放内核当中的表对象。
a. 频繁申请分配页面的对象减少负担(slab缓存之)
b. 例如:filesystem metadata(dentry and inode caches)
B. 监视:
cat /proc/slabinfo
slabtop
vmstat –m
下面命令查看内核是否支持slab:
grep CONFIG_SLAB /boot/config-*
11.6 ARP cache ARP缓存表
A. ARP表是用来映射硬件地址与协议地址的(MAC----IP)
a. ARP表缓存在slab里面( grep arp /proc/slabinfo)
b. 垃圾过滤器会定时删除表里旧的或过期的表项。
B.ARP缓存不足的话会导致:
a. 主机间通讯间歇性延时。
b. ARP表不稳定.
C. ARP缓存太大会给ZONE_NORMAL造成压力。
D. 查看ARP表项:
ip neighbor list
cat /proc/net/arp
E. 清空ARP表
Ip neighbor flush dev eth0
11.7 Tuning ARP cache ARP缓存调整
A. Soft upper limit软限制
net.ipv4.neigh.default.gc_thresh2 默认值512(条) :arp表项条数
达到这个值后过5秒钟才清除
B. Hard upper limit 硬限制
net.ipv4.neigh.default.gc_thresh3 默认值1024
C. 表项垃圾清除间隔时间(秒)
net.ipv4.neigh.default.gc_interval 默认值30秒
注:达到限制值128后每30秒清除一次ARP表
11.8 Page cache 页面缓存
A. 大部份页面活动都是由于I/O操作产生的。
a. 读文件:文件从磁盘读到内存
b. 读进来的这些数据页面都放在页面缓存里面
B. 页面缓存总是会去检查IO请求情况
a. 目录读取
b. 常规文件读写
c. 块设备文件读写
d. 访问内存映射文件
e. 访问swap 页面。
C. 页面缓存里面的页存放的都是跟file data 有关的数据.
11.9 Tuning page cache 页面缓存调整
A. 查看分配给页面缓存使用的地址大小 /proc/meminfo
B. 调整page cache在内存中分配的长度/大小
vm.lowmem_reserve_ratio 分配给page cache 的大小
vm.vfs_cache_pressure 虚拟内存回收director和inode缓冲的倾向,越大越易回收。
C. 调整到达率/完成率
vm.page-cluster 默认值3,2^3 单位:pages ,必须是2^n,与内存一次交换多少页。
vm.zone_reclaim_mode 页面回收
11.10 Anonymous pages 匿名页
A. 匿名页里存放的是其它进程的消耗性的数据
B. 存放的数据跟文件无关,但包括:
a. 程序数据—阵列,堆地址等等
b. 匿名内存范围
c. 脏页
d. 进程间通讯的共享内存范围
C. 查看使用量
grep Anon /proc/meminfo
cat /pro/PID/statm
D. 匿名页可以与swap交换数据.
Anonymous pages = RSS – Shared
11.11 SysV IPC 进程间通讯
A. 以下情况比较消耗内存
a. Semaphores 信号量 :协调进程间对共享资源的抢占
b. Message queues 消息队列:进程间交换信息
c. Share memory 共享内存:进程间所要访问的数据在内存当中的同一地方s
B. 查看SysV共享内存
ipcs 查看当前正在使用的情况
ipcs –l 查看共享内存的限制情况
C. 使用POSIX共享内存文件系统做一个最快的存储
dd if=/dev/zero 0f=/dev/shm/test bs=1M count=50
共享内存文件系统路径:/dev/shm 可以读写数据但重启后数据丢失。
11.12 Tuning SysV IPC 进程间通讯性能调整
A. 设置信号量数量(flags)
Kernel.sem
每个信号量集合的最大信号量数,默认为250,
整个系统所允许的最大信号量数,默认为32000,
每次IPC调用影响的信号量的最大数,默认为32,
信号量集合的最大数,默认为128。
注:运行高并发应用程序时(如:数据库),将系统的最大信号量数调大,以减少进程间对信号量的争抢
B. 消息数量与大小(non-pageable)
Kernel.msgmni=16,最大消息队列数,默认16
Kernel.msgmnb=16384,单个消息队列的最大字节数,默认16384,
Kernel.msgmax=8192,最大消息长度(整个消息块大小)。默认8192,
注:适用于少量数据交换
C.共享内存大小与数量
Kernel.shmni=4096,系统范围内共享内存段的最大数量,默认4096,
Kernel.shmmax每个共享内存段的最大尺寸(单位:字节)。。
Kernel.shmall=2097152,共享内存页面数(系统一次可以共享内存的总量,单位:页,SHMMAX/PAGE_SIZE),默认2097152
注:适用于海量数据交换(如:oracle数据库)
11.13 Viewing memory with free 查看内存释放情况
A. 用free -ltm 命令查看内存使用的总体情况
B. 计算/buffers/cache 单位(MiB)
used=used – bufers – cached
free= free + buffers + cached
grep –i memory /var/log/dmesg
grep e820 /var/log/dmesg
11.14 Other commands to view memory usage 查看内存使情况其它命令
A. 查看系统内存
cat /proc/meminfo
cat /proc/zoneinfo
a. 总的物理内存
b. 内存缓存大小
c. 正在使用的与未使用的
B. pages tables 页表
cat /proc/vmstat
C. Summary 汇总
vmstat –s
D. IO devices IO设备
cat /proc/iomem