Linux System and Performance Monitoring(Memory篇)

5.0 Virtual Memory介绍算法

虚拟内存就是采用硬盘对物理内存进行扩展,因此对可用内存的增长是要相对在一个有效范围内的.内核会写当前未使用内存块的内容到硬盘上,此时这部份内存被用于其它用途.当再一次须要原始内容时,此时再读回到内存中.这对于用户来讲,是彻底透明的;在Linux 下运行的程序可以看到,也仅仅是大量的可用内存,同时也不会留意到,偶尔还有部分是驻留在磁盘上的.固然,在硬盘上进行读和写,都是很慢的(大约会慢上千倍),相对于使用真实内存的话,所以程序没法运行的更快.用硬盘的一部分做为Virtual Memory,这就被称为”swap space”(译注:交换空间).缓存

5.1 Virtual Memory Pagesbash

虚拟内存被分为不少 pages(译注:页),在X86架构中,每一个虚拟内存页为 4KB.当内核写内存到磁盘或者读磁盘到内存,这就是一次写内存到页的过程.内核一般是在swap 分区和文件系统之间进行这样的操做.架构

5.2 Kernel Memory Pagingapp

内存分页在正常状况下老是活跃的,与memory swapping(译注:内存交换)之间不要搞错了.内存分页是指内核会按期将内存中的数据同步到硬盘,这个过程就是Memory Paging.日复一日,应用最终将会消耗掉全部的内存空间.考虑到这点,内核就必须常常扫描内存空间而且收回其中未被使用的内存页,而后再从新分配内存空间给其余应用使用.运维

5.3 The Page Frame Reclaim Algorithm(PFRA)(译注:页框回收算法)ide

PFRA 就是OS 内核用来回收并释放内存空间的算法.PFRA 选择哪一个内存页被释放是基于内存页类型的.页类型有如下几种:工具

Unreclaimable –锁定的,内核保留的页面
Swappable –匿名的内存页
Syncable –经过硬盘文件备份的内存页
Discardable –静态页和被丢弃的页性能

除了第一种(Unreclaimable)以外其他的均可以被PFRA进行回收.学习

与PFRA 相关的,还包括kswapd 内核线程以及Low On Memory Reclaiming(LMR算法) 这2种进程和实现.

5.4 kswapd

kswapd 进程负责确保内存空间老是在被释放中.它监控内核中的pages_high和pages_low阀值.若是空闲内存的数值低于 pages_low,则每次 kswapd 进程启动扫描并尝试释放32个free pages.并一直重复这个过程,直到空闲内存的数值高于 pages_high.

kswapd 进程完成如下几个操做:

1,若是该页处于未修改状态,则将该页放置回空闲列表中.
2,若是该页处于已修改状态并可备份回文件系统,则将页内容写入到磁盘.
3,若是该页处于已修改状态但没有任何磁盘备份,则将页内容写入到swap device.

# ps -ef | grep kswapd
root 30 1 0 23:01 ? 00:00:00 [kswapd0]

5.5 Kernel Paging with pdflush

pdflush 进程负责将内存中的内容和文件系统进行同步操做.也就是说,当一个文件在内存中进行修改后, pdflush 将负责写回到磁盘上.

# ps -ef | grep pdflush
root 28 3 0 23:01 ? 00:00:00 [pdflush]
root 29 3 0 23:01 ? 00:00:00 [pdflush]

当内存中存在10% 的脏页,pdflush 将被启动同步脏页回文件系统里.这个参数值能够经过 vm.dirty_background_ratio 来进行调整.

(译注:
Q:什么是脏页?
A:因为内存中页缓存的缓存做用,写操做实际上都是延迟的.当页缓存中的数据比磁盘存储的数据还要更新时,那么该数据就被称作脏页.)

# sysctl -n vm.dirty_background_ratio
10

在多数环境下,Pdflush与PFRA是独立运行的,当内核调用LMR时,LMR 就触发pdflush将脏页写入到磁盘里.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在2.4 内核下,一个高负荷的内存环境中,系统将遇到交换过程当中不断的崩溃.这是由于PFRA 从一个运行进程中,偷取其中一个内存页并尝试使用.致使结果就是,这个进程若是要回收那个页时,要是没有就会尝试再去偷取这个页,这样一来,就愈来愈糟糕了.在2.6 内核下,使用”Swap token”修复了这个BUG,用来防止PFRA 不断从一个进程获取同一个页.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

5.6 案例学习:大量的入口I/O

vmstat 工具报告里除了CPU 使用状况,还包括了虚拟内存.如下就是vmstat 输出中关于虚拟内存的部分:

Table 2: The vmstat Memory Statistics

[在此处输入文章标题]

账户                    Jobkoo 运维博客

Field Description
Swapd The amount of virtual memory in KB currently in use. As free memory reaches low thresholds, more data is paged to the swap device.

 

当前虚拟内存使用的总额(单位:KB).空闲内存达到最低的阀值时,更多的数据被转换成页到交换设备中.

 
Free The amount of physical RAM in kilobytes currently available to running applications.

 

当前内存中可用空间字节数.

 
Buff The amount of physical memory in kilobytes in the buffer cache as a result of read() and write() operations.

 

当前内存中用于read()和write()操做的缓冲区中缓存字节数

 
Cache The amount of physical memory in kilobytes mapped into process address space.

 

当前内存中映射到进程地址空间字节数

 
So The amount of data in kilobytes written to the swap disk.

 

写入交换空间的字节数总额

 
Si The amount of data in kilobytes written from the swap disk back into RAM.

 

从交换空间写回内存的字节数总额

 
Bo The amount of disk blocks paged out from the RAM to the filesystem or swap device.

 

磁盘块页面从内存到文件或交换设备的总额

 
Bi The amount of disk blocks paged into RAM from the filesystem or swap device.

 

磁盘块页面从文件或交换设备到内存的总额

 

如下 vmstat 的输出结果,就是演示一个在I/O 应用中,虚拟内存在高负荷状况下的环境

[root @monitor ~ ] # vmstat 3 -S m
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2  1     53   1077     23    511    0    0     9   217    6    6  2  1 93  4  0
0  1     53    762     24    817    0    0 49843 74592 1506 12141  1  9 49 42  0
0  6     53    531     24   1020    0    0 33057 143940 1392 2181  0  7 22 70  0
0  6     53    272     24   1284    0    0 42965 32768 1425 1068  0  6  0 94  0
1  4     53     56     24   1505    0    0 36091 39288 1387  980  0  5  0 94  0
0  6     53     54      6   1536    0    0 47065   424 1452 1171  0  8  0 92  0
0  6     53     26      7   1485    0    0 31433 247209 1358  961  5 12  0 84  0
0  6     53     49      7   1471    0    0 30111 43053 1355 1015  0  6  0 94  0
0  6     53     48      7   1477    0    0 43436 32768 1427 1097  0  7 34 59  0
0  6     53     51      7   1481    0    0 35235 43349 1371  979  0  7 49 44  0
0  6     53     54      6   1488    0    0 42411 43179 1425 1081  0  8 49 43  0
0  6     53     53      5   1499    0    0 36560 43349 1386  983  0  7 23 70  0

根据观察值,咱们能够获得如下结论:

1,大量的disk pages(bi)被写入内存,很明显在进程地址空间里,数据缓存(cache)也在不断的增加.

2,在这个时间点上,空闲内存(free) 始终保持在20~50MB,即便数据从硬盘读入而在消耗RAM.

3,为了维护空闲列表, kswapd 从读/写缓存区(buff)中获取内存并分配到空闲列表里.很明显能够看到buffer cache(buff) 在逐渐的减小中.

4, 同时kswapd 进程不断的写脏页到swap device(so)时,很明显虚拟内存的利用率是在逐渐的增长中(swpd).

5.7 结论

监控虚拟内存性能由如下几个部分组成:

1,当系统中出现较少的页错误,得到最好的响应时间,是由于memory caches(译注:内存高速缓存)比disk caches更快(译注:磁盘高速缓存).

2,较少的空闲内存,是件好事情,那意味着缓存的使用更有效率.除非在不断的写入swap device和disk.

3,若是系统不断报告,swap device老是繁忙中,那就意味着内存已经不足,须要升级了.

相关文章
相关标签/搜索