首页 > 代码库 > Linux内存子系统及常用调优参数

Linux内存子系统及常用调优参数

内存子系统及常用调优参数

内存子系统组件

 slab  allocator

 buddy system

 kswapd

 pdflush

 mmu

 虚拟化环境:

            PA(进程地址)-->HA(虚拟机地址)-->MA(物理机地址)

            虚拟机转换:PA-->HA

            guestOS虚拟机内核,OS物理机内核

            shadow PT

Memory:

      TLB:提升性能

HugePages 内存大页面

[root@localhost 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:永久生效

[root@localhost ~]# vim /etc/sysctl.conf
vm.nr_hugepages = 10

方法2:临时生效

[root@localhost domain1]# sysctl -w vm.nr_hugepages=10
vm.nr_hugepages = 10


挂在当做文件系统用

[root@localhost domain1]# mkdir /hugepages
[root@localhost domain1]# mount -t hugetlbfs none /hugepages


测试

[root@localhost ~]# dd if=/dev/zero of=/hugepages/a.test bs=100M count=1000000
[root@localhost ~]# 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 追踪命令时怎么执行的

[root@localhost ~]# strace cat /etc/fstab 追踪某个命令的运行路径



  1. 降低微型内存对象的系统开销

    slab

  2. 缩减慢速子系统的服务时间

    使用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 会杀死该进程.


[root@localhost ~]# ls /proc/1 下的

oom_score记录每个进程的oom分数,分数高的进程会被当做恶意进程杀掉。

oom_adj调整score的,可以优先监控某个进程,或尽可能留到最后杀掉。


slabtop随机监控系统的所有slab状态


[root@localhost ~]# 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个的时候不自动清理。


[root@localhost ~]# 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

[root@localhost ~]# 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

[root@localhost ~]# ip neighbor flush dev eth0 清空eth0上所有的缓存条目


[root@localhost ~]# 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)



[root@localhost ~]# cat /proc/sys/vm/lowmem_reserve_ratio
256    256    32

内存很低的时候预留多大空间,64位操作系统不用调整



[root@localhost ~]# cat /proc/sys/vm/vfs_cache_pressure

100

降低该值后尽可能少回收内存,达到优化效果,0表示不回收,有可能导致内存溢出,在0-100之间倾向于不回收。大于100则更倾向于回收。




[root@localhost ~]# cat /proc/sys/vm/page-cluster
3

page-cluster =1  控制需要将数据从内存拿到交换分区上去的时候一次拿多少个。默认是3

=1表示一次交换出去2的1次方个

=2表示一次交换出去2的2次方个

。。。


[root@localhost ~]# cat /proc/sys/vm/zone_reclaim_mode
0
zone_reclaim_mode 内存区域回收的时候更倾向回收哪一段的内存。

1表示内存区域回收功能打开

2表示回收写操作产生的页面

4表示回收swap的页面


Anonymous pages 匿名页

存放程序,进程自身产生的数据

IPC,进程之间通信也是由匿名页完成的


Anonymous pages = RSS-Shared

[root@localhost ~]# grep Anon /proc/meminfo  查看匿名页大小
AnonPages:         16104 kB
AnonHugePages:         0 kB

[root@localhost ~]# cat /proc/PID/statm 查看进程的匿名页




进程间通信管理命令

[root@localhost ~]# 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 移除某个消息队列


关于共享内存的参数:

[root@localhost ~]# cat /proc/sys/kernel/shmmni  系统级别,所允许使用的共享内存段上限
[root@localhost ~]# cat /proc/sys/kernel/shmall 系统级别,能够为共享内存分配使用的最大页面数
[root@localhost ~]# cat /proc/sys/kernel/shmmax  单个共享内存的最大大小上限有多大


关于消息的参数:ipcs -p 查看队列

[root@localhost ~]# cat /proc/sys/kernel/msgmnb 单个消息队列的上限。
65536
[root@localhost ~]# cat /proc/sys/kernel/msgmni 系统级别,消息队列的个数上限
1954
[root@localhost ~]# cat /proc/sys/kernel/msgmax 单个消息队列大小的上限,单位字节
65536


pdflush: 调整内存使用空间,清除内存上的章页到磁盘上去

[root@localhost ~]# cat /proc/sys/vm/nr_pdflush_threads  显示当前默认启动了多少个pdflush
0
[root@localhost ~]# cat /proc/sys/vm/dirty_background_ratio  相当于全部的内存来说,章页占了多大比例开始清写
[root@localhost ~]# cat /proc/sys/vm/dirty_ratio  单个进程的章页达到整个内存比例的多少开始清写
[root@localhost ~]# cat /proc/sys/vm/dirty_expire_centisecs  pdflush周期性启动的时间间隔,0表示禁止,单位是百分之一秒
[root@localhost ~]# 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

本文出自 “运维成长路” 博客,谢绝转载!

Linux内存子系统及常用调优参数