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



比较进程的oom分水,谁分数越高越优先被杀死,在可用内存空间被用尽时开始杀死进程

# cat /proc/PID/oom_score查看oom分数,分数是系统通过观察,自动生成的,参考标准为/proc/PID/oom_adj


oom_adj的值是从-17到15,有效范围是-16到15。-17则表示进程永远不会被oom kill掉,oom_adj的值越大得到的oom_score的值也会越大,被杀死的可能也就越大


# cat /proc/sys/vm/panic_on_oom 如果该值为0则表示启用oom功能,当内存空间不足时,开始杀掉进程,1表示不启用



如何使用valgrind 去评估内存分数

#valgrind --tool=memcheck cat /proc/$$/maps $$表示当前进程的进程号


评估结果:

==4316== HEAP SUMMARY:
==4316==     in use at exit: 0 bytes in 0 blocks
==4316==   total heap usage: 31 allocs, 31 frees, 40,544 bytes allocated
==4316==
==4316== All heap blocks were freed -- no leaks are possible   没有内存泄漏
==4316==
==4316== For counts of detected and suppressed errors, rerun with: -v
==4316== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)


使用watch -n 不间断的去观察某些进程

# watch -n1 'ps axo pid,comm,rss,vsize |grep sshd'

如果rss和vsize只增不减的时候就有可能内存泄漏了



# sar -R 1 120 查看整体内存的分配情况




Swap

Swap-out从系统写到swap交换分区上,非活动页,匿名页,

Swap-in 从swap上读取数据到系统


Swap cache从swap加载进来却没在内存中做任何修改的数据,此页面在内存删除后再swap上还有,可以有效的避免资源竞争。


提高swap性能,1使用小swap分区,2降低访问次数,3降低服务时间。


调整使用swap的概率:

# cat /proc/sys/vm/swappiness  使用swap的倾向百分比,大于100则开始启用swap


swap大小

批处理系统:4倍的RAM

数据库服务器:<=1G

web server:>=0.5倍RAM


调优性能:多个设备多建几个分区

/dev/sda1                  swap      swap    pri=5     0  0

/dev/sdb1                  swap      swap    pri=5     0  0

LABEL=testswap        swap      swap    pri=5     0  0

/swaps/swapfile1       swap      swap    pri=1     0  0


sar -W显示交换分区的动态




sar -B   显示IO状况

pgpgin/s IO读进

pgpgout/s     读出

fault/s   错误

majflt/s

pgfree/s 页面释放,每秒钟平均个数

pgscank/s  扫描个数

pgscand/s

pgsteal/s   

%vmeff



总结内存优化需要调的:

Hugepage

IPC

pdflush

slab

swap

oom



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章