内存子系统及常用调优参数
内存子系统组件
slab allocator
buddy system
kswapd
pdflush
mmu
虚拟化环境:
PA(进程地址)-->HA(虚拟机地址)-->MA(物理机地址)
虚拟机转换:PA-->HA
guestOS虚拟机内核,OS物理机内核
shadow PT
Memory:
TLB:提升性能
HugePages 内存大页面
[[email protected] domain1]# cat /proc/meminfo |grep -i Huge
AnonHugePages: 0 kB
HugePages_Total: 0 未启用
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Enable hugepages 启用
方法1:永久生效
[[email protected] ~]# vim /etc/sysctl.conf
vm.nr_hugepages = 10
方法2:临时生效
[[email protected] domain1]# sysctl -w vm.nr_hugepages=10
vm.nr_hugepages = 10
挂在当做文件系统用
[[email protected] domain1]# mkdir /hugepages
[[email protected] domain1]# mount -t hugetlbfs none /hugepages
测试
[[email protected] ~]# dd if=/dev/zero of=/hugepages/a.test bs=100M count=1000000
[[email protected] ~]# ll -h /hugepages/
total 0
-rw-r--r--. 1 root root 0 Jun 5 12:18 a.test
因为是内存 所以大小为0,且不允许用户直接使用(不能复制和新建文件进去),只能进程使用
strace 追踪命令
1.strace -p PID 追踪已启动进程是怎么调用系统资源的
-o 指定追踪到以后的输出路径,保存到文件中。
-p 指定进程的pid
-c追踪整体结果
2.strace COMMAND 追踪命令时怎么执行的
[[email protected] ~]# strace cat /etc/fstab 追踪某个命令的运行路径
- 降低微型内存对象的系统开销
slab
- 缩减慢速子系统的服务时间
使用buffer cache缓存文件元素据
使用page cache缓存DISK IO
使用shm完成进程间通信
使用buffer cache ,arp cache和connetion tracking提升网络IO性能
过量使用:
CPU的过量使用,多台虚拟机CPU总数超过物理机
内存的过量使用,超出物理内存的一部分,以swap为前提
使用swap:
# cat /proc/sys/vm/overcommit_memory
0 启发式过量,系统自己决定如何过量使用
1总是过量使用,在数据库服务器上尽可能不要使用swap
2所有的物理内存加上一部分swap
# cat /proc/sys/vm/overcommit_ratio
50 表示可以超出物理内存的百分比,这里是50%,一般尽可能不超过50%(确保50%不超过swap空间)
内存溢出时,OOM 会杀死该进程.
[[email protected] ~]# ls /proc/1 下的
oom_score记录每个进程的oom分数,分数高的进程会被当做恶意进程杀掉。
oom_adj调整score的,可以优先监控某个进程,或尽可能留到最后杀掉。
slabtop随机监控系统的所有slab状态
[[email protected] ~]# cat /proc/slabinfo 查看换存量大小
tw_sock_TCPv6 0 0 320 12 1 : tunables 54 27 8 : slabdata 0 0 0
###limit=54代表可以被每一个cpu缓存的最大对象数,可以调整
###batchcount=27 表示当cpu缓存空的时候最大可以一次性让cpu缓存下来多少个对象,可调整
###shared=8 表示在各cpu之间可以共享多少个slab cache (共享多少个缓存的),可调整
调整缓存量大小的方法:
# echo ‘tw_sock_TCPv6 108 54 8‘ > /proc/slabinfo
如何调整网络IO的arp缓存:
软限制可以超出50% 默认为512
硬限制绝对不能超出 默认为1024
gc:垃圾回收器,默认缓存条目少于128个的时候不自动清理。
[[email protected] ~]# cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.0.149 0x1 0x2 28:d2:44:8e:5c:16 * eth0
192.168.0.163 0x1 0x2 08:ed:b9:12:c1:6d * eth0
[[email protected] ~]# ip neighbor list 显示缓存条目
192.168.0.163 dev eth0 lladdr 08:ed:b9:12:c1:6d REACHABLE
192.168.0.146 dev eth0 lladdr b4:b5:2f:dc:aa:72 STALE
[[email protected] ~]# ip neighbor flush dev eth0 清空eth0上所有的缓存条目
[[email protected] ~]# ls -l /proc/sys/net/ipv4/neigh/default
total 0
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_interval
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_thresh1
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_thresh2
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_thresh3
gc_thresh1 清理预值,默认128个,超过128个为过期条目,允许使用5分钟,后由gc自动清理
gc_thresh2 软限制,默认512个,超出软限制的部分只允许存在5秒钟,个数不能达到硬限
gc_thresh3 硬限制,默认1024个
gc_interval 定义每过几秒钟检查一下哪些过期。
页缓存:page cache降低磁盘IO,把文件读取出来放在内存里
lowmen_reserve_ratio 内存很低的时候预留多大空间,64位操作系统不用调整
vfs_cache_pressure 控制内核去回收内存的趋势(回收inode,directory)
[[email protected] ~]# cat /proc/sys/vm/lowmem_reserve_ratio
256 256 32
内存很低的时候预留多大空间,64位操作系统不用调整
[[email protected] ~]# cat /proc/sys/vm/vfs_cache_pressure
100
降低该值后尽可能少回收内存,达到优化效果,0表示不回收,有可能导致内存溢出,在0-100之间倾向于不回收。大于100则更倾向于回收。
[[email protected] ~]# cat /proc/sys/vm/page-cluster
3
page-cluster =1 控制需要将数据从内存拿到交换分区上去的时候一次拿多少个。默认是3
=1表示一次交换出去2的1次方个
=2表示一次交换出去2的2次方个
。。。
[[email protected] ~]# cat /proc/sys/vm/zone_reclaim_mode
0
zone_reclaim_mode 内存区域回收的时候更倾向回收哪一段的内存。
1表示内存区域回收功能打开
2表示回收写操作产生的页面
4表示回收swap的页面
Anonymous pages 匿名页
存放程序,进程自身产生的数据
IPC,进程之间通信也是由匿名页完成的
Anonymous pages = RSS-Shared
[[email protected] ~]# grep Anon /proc/meminfo 查看匿名页大小
AnonPages: 16104 kB
AnonHugePages: 0 kB
[[email protected] ~]# cat /proc/PID/statm 查看进程的匿名页
进程间通信管理命令
[[email protected] ~]# ipcs -l 查看当前的内存设置
------ Shared Memory Limits --------
max number of segments = 4096 共享内存最大多大
max seg size (kbytes) = 67108864 段大小最大是多少个字节
max total shared memory (kbytes) = 17179869184 允许在全局范围内使用的内存多大
min seg size (bytes) = 1 最小段是个字节
------ Messages: Limits --------
max queues system wide = 1954 全局范围内最大有多少个队列
max size of message (bytes) = 65536 每一个信息的最大大小是多少
default max size of queue (bytes) = 65536 默认每一个队列所能接受的消息的最大体积是多大
ipcrm 移除某个消息队列
关于共享内存的参数:
[[email protected] ~]# cat /proc/sys/kernel/shmmni 系统级别,所允许使用的共享内存段上限
[[email protected] ~]# cat /proc/sys/kernel/shmall 系统级别,能够为共享内存分配使用的最大页面数
[[email protected] ~]# cat /proc/sys/kernel/shmmax 单个共享内存的最大大小上限有多大
关于消息的参数:ipcs -p 查看队列
[[email protected] ~]# cat /proc/sys/kernel/msgmnb 单个消息队列的上限。
65536
[[email protected] ~]# cat /proc/sys/kernel/msgmni 系统级别,消息队列的个数上限
1954
[[email protected] ~]# cat /proc/sys/kernel/msgmax 单个消息队列大小的上限,单位字节
65536
pdflush: 调整内存使用空间,清除内存上的章页到磁盘上去
[[email protected] ~]# cat /proc/sys/vm/nr_pdflush_threads 显示当前默认启动了多少个pdflush
0
[[email protected] ~]# cat /proc/sys/vm/dirty_background_ratio 相当于全部的内存来说,章页占了多大比例开始清写
[[email protected] ~]# cat /proc/sys/vm/dirty_ratio 单个进程的章页达到整个内存比例的多少开始清写
[[email protected] ~]# cat /proc/sys/vm/dirty_expire_centisecs pdflush周期性启动的时间间隔,0表示禁止,单位是百分之一秒
[[email protected] ~]# cat /proc/sys/vm/dirty_writeback_centisecs 一个脏页在内存中存储多久以后变为过期,并且需要立即启动清写线程
手动清写脏缓存和缓存:先同步再释放
sync命令
echo s > /proc/sysrq-trigger
echo 3> /proc/sys/vm/drop_caches
1表示释放pagecache
2表示释放dentries 和inodes
3表示释放pagecache和dentries和 inodes
29:00