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

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

内存子系统组件

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 追踪某个命令的运行路径

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

[[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

时间: 2024-10-11 22:47:19

Linux内存子系统及常用调优参数的相关文章

转:Dubbo性能调优参数及原理

from: https://www.cnblogs.com/cyfonly/p/8987043.html 文是针对 Dubbo 协议调用的调优指导,详细说明常用调优参数的作用域及源码. Dubbo调用模型 常用性能调优参数 参数名 作用范围 默认值 说明 备注 threads provider 200 业务处理线程池大小   iothreads provider CPU+1 io线程池大小   queues provider 0 线程池队列大小,当线程池满时,排队等待执行的队列大小, 建议不要设

JVM常用的调优参数

-Xms512m -Xmx1024m -XX:MaxPermSize=1204m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 上面是一般性调优测试,设置Java JVM整体的优化参数: set JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=1204m XX:+CMSClassUnloadingEnabled -XX:+CMSPe

Linux TCP/IP调优参数 /proc/sys/net/目录

所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default "110592" 定义默认的接收窗口大小:对于更大的 BDP 来说,这个大小也应该更大. /proc/sys/net/core/rmem_max "110592" 定义接收窗口的最大大小:对于更大的 BDP 来说,这个大小也应该更大. /proc/sys/net/core/wmem

Java内存泄露及性能调优

内存泄漏及解决方法 1.系统崩溃前的一些现象:每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4.5sFullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC年老代的内存越来越大并且每次FullGC后年老代没有内存被释放 之后系统会无法响应新的请求,逐渐到达OutOfMemoryError的临界值. 2.生成堆的dump文件 通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没

转: jvm调优参数总结

JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:young generation,tenured generation和permanet generation.绝大部分的objec被分配在young gener

Hadoop调优参数总结

Map端调优参数 属性名称 类型 默认值 说明 io.sort.mb int 100 排序map输出时所使用的内存缓冲区大小,以M为单位.当节点内存较大时,可调高该参数,以减少磁盘写入次数. io.sort.record.percent float 0.05 用作存储map输出(io.sort.mb)记录的比例.剩余的空间用来存储map输出记录本身 io.sort.spill.percent float 0.80 map输出开始写磁盘的阈值. io.sort.factor int 10 map输

hadoop作业调优参数整理及原理

1 Map side tuning参数 1.1 MapTask运行内部原理 当map task开始运算,并产生中间数据时,其产生的中间结果并非直接就简单的写入磁盘.这中间的过程比较复杂,并且利用到了内存buffer来进行已经产生的部分结果的缓存,并在内存buffer中进行一些预排序来优化整个map的性能.如上图所示,每一个map都会对应存在一个内存buffer(MapOutputBuffer,即上图的buffer in memory),map会将已经产生的部分结果先写入到该buffer中,这个b

JVM调优参数

堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作系统对内存无限制.我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m.典型设置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-Xmx3550m:设置JVM最大可用内存为3550M.-Xms3550m:设

JVM性能调优2:JVM性能调优参数整理

本系列包括: JVM性能调优1:JVM性能调优理论及实践(收集整理) JVM性能调优2:JVM性能调优参数整理 JVM性能调优3:JVM_堆溢出分析过程和命令 JVm性能调优4:GC日志分析 JVM性能调优5:Heap堆分析方法  序号 参数名 说明 JDK 默认值 使用过 1 JVM执行模式 2 -client -server 设置该JVM运行与Client 或者Server Hotspot模式,这两种模式从本质上来说是在JVM中运行不同的JIT(运行时编译模块)代码,并且两者在JVM内部