Linux 内部存款和储蓄器计算

物理内存 + 占用的swap = 空闲物理内存 + Memory buffer + Disk Cache +
使用掉的驻留内存

Linux操作系统性能分析主要包含磁盘IO、CPU、内存以及网络流量,而这里主要针对系统内存的使用进程情况做个分析。
一、如何查看系统内存使用情况
1、根据常用命令查看系统内存使用概况
free  -g
                  total      used      free    shared    buffers   
cached
Mem:            31          31          0          0          0         
3
-/+ buffers/cache:        28          3
Swap:          15            7          7
(根据free命令可以看到,系统使用了28G的物理内存,3G的剩余内存,其中swap总15G,已使用7G)

 

在做监控时,发现内存中有一项Swap space,不是很理解,这里查了一些资料:

4G + 53MB = 17MB + 46MB + 3.2GB + ?

top  (f p M)
top – 14:18:50 up 1280 days,  7:15,  1 user,  load average: 1.05, 1.25,
1.12
Tasks: 229 total,  1 running, 227 sleeping,  0 stopped,  1 zombie
Cpu(s):  0.2%us,  0.1%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si, 
0.0%st
Mem:  32949816k total, 32848840k used,  100976k free,  169308k buffers
Swap: 16771776k total,  8384616k used,  8387160k free,  3276360k
cached

1、

 

所以使用掉的驻留内存差不多有700-800MB

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP DATA
COMMAND                                                     
12428 mysql    15  0 22.2g  20g 3964 S  3.3 66.5  91946:06 1.3g  22g
mysqld                                                       
22840 cyldj    15  0 9059m 6.7g 9012 S  0.0 21.5  22:05.42 2.1g 8.7g
DBAgent                                                     
28689 root      15  0  358m  30m 3036 S  0.0  0.1 187:37.41 328m 137m
salt-minion                                                 
30768 cyldj    21  0  462m  10m 1908 S  0.0  0.0  10:44.60 451m 373m
java                                                         
22567 root      15  0 86004 3292 2576 S  0.0  0.0  0:00.01  80m  688
sshd                                                         
28690 root      20  0  267m 2188  704 S  0.0  0.0  0:00.00 264m  47m
salt-minion                                                 
  661 root      18  0 16340 1836 1632 S  0.0  0.0  0:47.42  14m  308
zabbix_agentd                                               
22569 root      15  0 68156 1520 1188 S  0.0  0.0  0:00.02  65m  408
bash                                                         
 2901 root      18  0  197m 1336  884 S  0.0  0.0  4:04.57 196m 174m
AxisAgent                                                   
11236 root      15  0 60672 1324  760 S  0.0  0.0  2:01.21  57m  608
sshd                                                         
  665 root      15  0 18432 1260  992 S  0.0  0.0  11:39.82  16m  308
zabbix_agentd                                               
  662 root      15  0 18432 1256  992 S  0.0  0.0  11:43.36  16m  308
zabbix_agentd
(根据top命令可以看到使用内存最大的进程是mysql进程,其次是dbagent,其中dbagent使用的交换分区较多)

也许你会经常遇到一个经典的swap大小设置问题(比如狗血的面试题)。

再累计你top出来那些进程的驻留内存数量,应该是八九不离十的。

nmon (m)
图片 1
nmon下载地址:
 
(RHEL5)

(RHEL6)
(通过nmon可以看到内存的详细分配情况,其中总内存为32177.6 MB,总swap
16378.7 MB ,空闲93.4 MB,可回收3188.2+166.5
MB,已使用交换分区7273.6MB,已使用的活动数据大小为30099.9MB,可以被交换出内存的数据大小为1590.7 
MB)

很多人多会说内存的2倍、、

 

从你的操作系统的性能数据来看,物理内存还空闲的很,大部分物理内存被操作系统用做disk
cache,可能你的系统IO还是稍微有点频繁的。swap也占用了一点,说明操作系统曾经出现过短暂的内存吃紧的状况,把一些闲置进程换到了swap上
去了,而这些闲置进程一直也没有再被使用到过,所以一直待在swap里面没有出来过。

2、根据系统监控查看系统内存使用情况

但是个人认为一般而言 swap 不要设置太大,最好不要超过4G。

在linux系统中,启动一个程序,它占用的内存假设是1G,但是运行一段时间后,使用top查看进行信息,你会发现它的内存只剩几十M了,这是因为内存不足,它的内存被swap走了。
若开启了swap,则系统会有一个交换空间在硬盘里,你的内存数据正是被交换到硬盘里,因此程序会运行的比较慢。
你可以用free -m命令查看交换空间使用了多少了。

图片 2

图片 3

 

Linux的产生和发展,更多的应用和服务器,那么对于Linux的各个管理机制要非常清晰,一个完整的Linux系统主要有存储管理,内存管理,文件系统和进程管理等几方面组成,贴出一些以前学习过的一个非常好的文章。和大家共享!以下主要说明Swap机制:

(近7天的内存使用情况)
3、查看指定进程的系统内存使用信息
cat /proc/22840/statm
#virt    res    shr  text lib data dt  
2319113 1768037 2253 3836 0 2292997 0
(上述是查看dbagent的内存使用信息,其中单位是页数,所以要看系统页大小4K,第一列是虚拟内存2319113页,第二列是驻留内存1768037页,第三列是共享内存2253页,进程独占内存大小为res-shr)
getconf  PAGESIZE
4096
awk ‘/^Swap:/ {SWAP+=$2}END{print SWAP”
KB”}’ /proc/${pid}/smap

for i in `cd /proc;ls
|grep “^[0-9]”|awk ‘ $0 >100’` ;do awk ‘/Swap:/{a=a+$2}END{print
‘”$i”‘,a/1024″M”}’ /proc/$i/smaps ;done |sort -k2nr

(上述命令可以查看进程虚拟内存使用情况)
cat /proc/22840/status |grep
Vm

VmPeak:  9341632 kB
VmSize:  9276452 kB
VmLck:        0 kB
VmHWM:  7074296 kB
VmRSS:  7073540 kB
VmData:  9171904 kB
VmStk:        84 kB
VmExe:    15344 kB
VmLib:      4728 kB
VmPTE:    15596 kB
(上述命令可以查看指定进程的内存使用情况VmSize表示虚拟内存大小,VmRSS表示驻留内存大小)
二、综合分析MYSQL数据库内存使用情况 sh show_mem_usage.sh
全局内存大小:18592.00 MB
单线程最大内存:25.18 MB
最大线程占用内存: 8815.62 MB
历史最大线程占用内存: 5213.81 MB
Innodb Buffer Pool使用率: 99.00%
从mysql的内存使用和总的物理内存使用来看,服务器的内存使用已经基本达到上限(mysql驻留内存大约是21G,dbagent大约为7G,物理总内存为31G,缓存了3G,大约有2G左右的非活动区内存),当mysql进程、dbagent使用超过5G内存,物理内存不够,就会使用到了swap分区。
三、什么情况下会使用swap分区
1、物理内存确实不够用的情况下,会使用到swap分区。
2、物理内存还有足够的内存使用,比如cache,buffer的剩余较多的情况下使用了swap分区
四、使用swap分区扩展
如果有足够的物理内存,依旧使用了swap分区,可以从以下几方面查看为什么使用了swap分区
1、swap分区比例调整
cat /etc/sysctl.conf  |grep swap   
vm.swappiness=0
设置为0表示优先最大限度的使用物理内存缓存数据,而不是磁盘作为分区,值越大越不利于物理内存的充分利用
2、numa陷阱

2、

Linux支持虚拟内存(virtual
memory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这
块内存就可用于其他目的。当需要用到原始的内容时,他们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程式只是看到有大量的内存可
供使用而并没有注意到时不时他们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程式就不会象一直在内存中运行
的那样快。用作虚拟内存的硬盘部分被称为交换空间(Swap Space)。

图片 4图片 5

进程申请内存不足时,发现某些进程占用空闲内存:
swap out :
os   mem–> swap

  一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳他们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。

 

当被swap out的进程从空闲状态转换为需要使用内存状态,发现内存不足:
swap in  :
os  swap –> mem

  有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用
非常多物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没
有什么可担心的,不过知道了是怎么一回事,也就无所谓了。

为了提高cpu和内存的数据访问速度、并发度,设计了numa架构,但如果numa的内存分配策略不合理,那么将会严重影响到内存的使用,尤其是对大内存块使用的数据库服务器。
#numactl –hardware   
available: 2 nodes (0-1)
node 0 size: 16160 MB
node 0 free: 15 MB
node 1 size: 16131 MB
node 1 free: 78 MB
node distances:
node  0  1
  0:  10  20
  1:  20  10
(上述命令可以查看各个node节点的物理内存分配情况,可以看到两节点的内存分配比例基本平均,如果node0节点free和和node1的free值相差较大,说明分配策略存在问题,很大可能会带来swap使用,而物理内存空闲的状态)
也可以通过查看numastat查看numa的miss和hit比例来进一步确认
#numastat
                          node0          node1
numa_hit            39150779957    38736256884
numa_miss            2658848763      8851827358
numa_foreign          8851827296      2658848763
interleave_hit        122652306      137287417
local_node          39096884744    38598664497
other_node            2712743976      8989419745
3、解决方案
(1)启用大页管理
(2)关闭numa
***BIOS关闭NUMA
***启动内核关闭:
vi /boot/grub/grub.conf
kernel /boot/vmlinuz-2.6.18-128.1.16.0.1.el5 root=LABEL=DBSYS ro
bootarea=dbsys rhgb quiet console=ttyS0,115200n8 console=tty1
crashkernel=128M@16M numa=off
重启操作系统,通过cat /proc/cmdline和numactl –hardware查看是否关闭
(3)调整内核参数
内核参数:zone_reclaim_mode,如果为0的话,那么系统会倾向于从其他节点分配内存,如果是1表示系统会倾向于从本地节点回收Cache内存多数时候
              vm.swappiness=0

echo 0 > /proc/sys/vm/zone_reclaim_mode ; echo
“vm.zone_reclaim_mode = 0” >> /etc/sysctl.conf
(4)调整内核参数
Mysql可以调整相关参数、交叉启动方式来改善numa,例如numactl
–interleave=all  /etc/init.d/mysql start
localalloc规定进程从当前node上请求分配内存;
preferred比较宽松地指定了一个推荐的node来获取内存,如果被推荐的node上没有足够内存,进程可以尝试别的node。
membind可以指定若干个node,进程只能从这些指定的node上请求分配内存。
interleave规定进程从指定的若干个node上以RR(Round Robin
轮询调度)算法交织地请求分配内存。

通过vmstat命令可以看到swap out ,swap in (so,si) 的情况:

  许多操作系统使用了虚拟内存的方法。因为他们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其他的就是一种浪费。所以让他们共享一个交换空间将会更有效率。

发表评论

电子邮件地址不会被公开。 必填项已用*标注