drop_cache-sar

查线上问题:

1、cpu  idle 为0 ,I/O高,

pidstat 发现进程io 不高,那就是cache mem引起系统io高了

没有vmstat,只能使用sar工具了,使用sar -r  查看buddyinfo 发现内存碎片化严重。同时drop_cache值为3一直在释放cache ,

eg:对文件系统大量的随机读写,page cache 上涨,内存吃紧,page cache 不断换入换出,磁盘瓶颈,CPU 高,属于一种情况 ;设置drop_cache值为1;

另外一种类似的情况是reclaimable slab objects 占用高(dentries,inodes;可以设置drop_cache值为2  释放

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches

echo 写入之后,值不会变,怎么办?会不会一直在drop?----不会,所以可以在内核代码里面加一个timer 定时释放

注意:  * iostat 工具提供CPU使用率及硬盘吞吐效率的数据;
    * mpstat 工具提供单个处理器或多个处理器相关数据;
    * sar 工具负责收集、报告并存储系统活跃的信息;
   sar 工具的使用

-A 显示所有历史数据,通过读取/var/log/sar 目录下的所有文件,并把它们分门别类的显示出来;
-b 通过设备的I/O中断读取设置的吞吐率;
-B 报告内存或虚拟内存交换统计;
-c 报告每秒创建的进程数;
-d 报告物理块设备(存储设备)的写入、读取之类的信息,如果直观一点,可以和p参数共同使用,-dp
-f 从一个二进制的数据文件中读取内容,比如 sar -f filename
-i interval 指定数据收集的时间,时间单位是秒;
-n 分析网络设备状态的统计,后面可以接的参数有 DEV、EDEV、NFS、NFSD、SOCK等。比如-n DEV
-o 把统计信息写入一个文件,比如 -o filename ;
-P 报告每个处理器应用统计,用于多处理器机器,并且启用SMP内核才有效;
-p 显示友好设备名字,以方便查看,也可以和-d 和-n 参数结合使用,比如 -dp 或-np
-r 内存和交换区占用统计;
-R
-t 这个选项对从文件读取数据有用,如果没有这个参数,会以本地时间为标准 读出;
-u 报告CPU利用率的参数;
-v 报告inode, 文件或其它内核表的资源占用信息;
-w 报告系统交换活动的信息; 每少交换数据的个数;
-W 报告系统交换活动吞吐信息;
-x 用于监视进程的,在其后要指定进程的PID值;
-X 用于监视进程的,但指定的应该是一个子进程ID;

/var/tmp/debug_bin #free -m
             total         used         free       shared      buffers
Mem:        238532       163460        75072            0         3752
-/+ buffers:             159708        78824
Swap:            0            0            0
-----------------
nux 3.6.5-Broadcom Linux ((none))     03/27/20        _armv7l_        (1 CPU)

10:04:39    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
10:04:41        71696         0    116268     48.74      4444     33156    276800    116.04     85288     15052         0
10:04:43        72776         0    116248     48.73      4564     31976    276800    116.04     85280     13980         0
10:04:45        73976         0    116228     48.73      4456     30908    276800    116.04     85332     12744         0
Average:        72816         0    116248     48.73      4488     32013    276800    116.04     85300     13925         0
 /var/tmp/debug_bin #sar -u 2 3
Linux 3.6.5-Broadcom Linux ((none))     03/27/20        _armv7l_        (1 CPU)

10:13:45        CPU     %user     %nice   %system   %iowait    %steal     %idle
10:13:47        all      1.98      0.00      0.50     97.52      0.00      0.00
10:13:49        all     16.42      0.00      2.49     81.09      0.00      0.00
10:13:51        all      8.46      0.00      2.49     89.05      0.00      0.00
Average:        all      8.94      0.00      1.82     89.24      0.00      0.00
 /var/tmp/debug_bin #sar -d -p 2 2
Linux 3.6.5-Broadcom Linux ((none))     03/27/20        _armv7l_        (1 CPU)

10:14:57          DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:14:59    mtdblock3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:15:01    mtdblock3      0.50     33.66      0.00      0.00     68.00      0.09     20.00      6.93
Average:    mtdblock3      0.25     16.87      0.00      0.00     68.00      0.04     20.00      3.47
 /var/tmp/debug_bin #sar -d -p 2 4
Linux 3.6.5-Broadcom Linux ((none))     03/27/20        _armv7l_        (1 CPU)

10:15:10          DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:15:12    mtdblock3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:15:14    mtdblock3      0.00     21.89      0.00      0.00      0.00      0.17      0.00      3.48
10:15:16    mtdblock3      3.96    134.65      0.00      0.00     34.00      0.67    213.75     21.78
10:15:18    mtdblock3      4.98    179.10      0.00      0.00     36.00      1.21    234.00     44.78
Average:    mtdblock3      2.24     83.98      0.00      0.00     37.56      0.51    225.00     17.52
 /var/tmp/debug_bin #pidstat  -d 2 2
Linux 3.6.5-Broadcom Linux ((none))     03/27/20        _armv7l_        (1 CPU)

10:22:56      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command

10:22:58      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command

Average:      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
 #sar -d 1 3
Linux 3.6.5-Broadcom Linux ((none))     03/27/20        _armv7l_        (1 CPU)

10:24:09          DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:24:10      dev31-3      4.04    235.35      0.00      0.00     58.25      0.77    362.50     52.53
10:24:11      dev31-3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:24:12      dev31-3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:      dev31-3      1.32     77.15      0.00      0.00     58.25      0.25    362.50     17.22
Top:
Mem: 152892K used, 85640K free, 0K shrd, 400K buff, 23568K cached CPU: 15% usr 1% sys 0% nic 0% idle 81% io 0% irq 0% sirq Load average: 2.61 3.16 3.16 1/122 3289 PID PPID USER STAT VSZ %VSZ %CPU COMMAND
Ps:

S UID PID PPID VSZ RSS TTY STIME TIME CMD
S 0 1 0 848 12 0:0 Mar20 00:00:07 /bin/busybox init
S 0 2 0 0 0 0:0 Mar20 00:00:00 [kthreadd]
S 0 3 2 0 0 0:0 Mar20 00:00:29 [ksoftirqd/0]
S 0 5 2 0 0 0:0 Mar20 00:00:00 [kworker/0:0H]
S 0 6 2 0 0 0:0 Mar20 00:00:00 [kworker/u:0]
S 0 7 2 0 0 0:0 Mar20 00:00:00 [kworker/u:0H]
S 0 8 2 0 0 0:0 Mar20 00:00:00 [migration/0]


(注意top中的vsz rss意义;
VSZ:virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject
  to change. (alias vsize).虚拟内存,
RSS:是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存。)

 

 结果:查看buddyinfo 有但是无大块, pid进程io不高,但是系统i.o高------>  cachemem 原因了

 

eg:顺便说一下虚拟内存空间分布

通过这张图你可以看到,用户空间内存,从低到高分别是五种不同的内存段。

只读段,包括代码和常量等。

数据段,包括全局变量等。

堆,包括动态分配的内存,从低地址开始向上增长。

文件映射段,包括动态库、共享内存等,从高地址开始向下增长。

栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB

在这五个内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存;

  内存分配与回收malloc() 是 C 标准库提供的内存分配函数,对应到系统调用上,有两种实现方式,即 brk() 和 mmap()。对小块内存(小于 128K),C 标准库使用 brk() 来分配,也就是通过移动堆顶的位置来分配内存。这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用。而大块内存(大于 128K),则直接使用内存映射 mmap() 来分配,也就是在文件映射段找一块空闲内存分配出去。

  这两种方式,自然各有优缺点。brk() 方式的缓存,可以减少缺页异常的发生,提高内存访问效率。不过,由于这些内存没有归还系统,在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片。

  而 mmap() 方式分配的内存,会在释放时直接归还系统,所以每次 mmap 都会发生缺页异常。在内存工作繁忙时,频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大。这也是 malloc 只对大块内存使用 mmap  的原因。

  在发现内存紧张时,系统就会通过一系列机制来回收内存,比如下面这三种方式:

  回收缓存,比如使用 LRU(Least Recently Used)算法,回收最近使用最少的内存页面;

  回收不常访问的内存,把不常用的内存通过交换分区直接写到磁盘中;

  杀死进程,内存紧张时系统还会通过 OOM(Out of Memory),直接杀掉占用大量内存的进程。

  Swap 其实就是把一块磁盘空间当成内存来用。它可以把进程暂时不用的数据存储到磁盘中(这个过程称为换出),当进程访问这些内存时,再从磁盘读取这些数据到内存中。所以,你可以发现,Swap 把系统的可用内存变大了。不过要注意,通常只在内存不足时,才会发生 Swap 交换。并且由于磁盘读写的速度远比内存慢,Swap 会导致严重的内存性能问题。

目前一般讲软够守护进程设置为禁止oom :通过 /proc 文件系统,手动设置进程的 oom_adj ,从而调整进程的 oom_score。oom_adj 的范围是 [-17, 15],数值越大,表示进程越容易被 OOM 杀死;数值越小,表示进程越不容易被 OOM 杀死,其中 -17 表示禁止 OOM。

 

对free/top 中出现的buffer以及cache

free Unused memory (MemFree and SwapFree in /proc/meminfo)

shared :Memory used (mostly) by tmpfs (Shmem in /proc/meminfo, available on kernels 2.6.32, displayed as zero if not available)

buffers:Memory used by kernel buffers (Buffers in /proc/meminfo):Buffers 是内核缓冲区用到的内存,对应的是  /proc/meminfo 中的 Buffers 值

cache :Memory used by the page cache and slabs (Cached and Slab in /proc/meminfo)Cache 是内核页缓存和 Slab 用到的内存,对应的是  /proc/meminfo 中的 Cached 与 SReclaimable 之和。

man proc可以看到如下信息

Buffers %lu:Relatively temporary storage for raw disk blocks that shouldn't get tremendously large (20MB or so).-----> 写磁盘用到Buffer??

Cached %lu:In-memory cache for files read from the disk (the page cache). Doesn't include SwapCached.Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘------>Cache 是对从文件读取数据的缓存?????

 

buffer,缓冲区;cache,缓存。
先看英语解释,大体上看起来这样的:A bufferis something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use

buffer/cache:

Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。 相当于操作裸数据

Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。-----这个是操作宇文件系统

 

1、page cahe和buffer cache

 

  Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。 

  Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。 
简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。 
  
补充一点,在文件系统层每个设备都会分配一个def_blk_ops的文件操作方法,这是设备的操作方法,在每个设备的inode下面会存在一个radix tree,这个radix tree下面将会放置缓存数据的page页。这个page的数量将会在top程序的buffer一栏中显示。如果设备做了文件系统,那么会生成一个inode,这个inode会分配ext3_ops之类的操作方法,这些方法是文件系统的方法,在这个inode下面同样存在一个radix tree,这里会缓存文件的page页,缓存页的数量在top程序的cache一栏进行统计。从上面的分析可以看出,2.6内核中的buffer cache和page cache在处理上是保持一致的,但是存在概念上的差别,page cache针对文件的cache,buffer是针对磁盘块数据的cache,仅此而已。

 

dd if=/tmp/file of=/dev/null
dd if=/dev/sda3 of=/dev/null bs=1M count=200
测试

 

posted @ 2020-03-26 21:49  codestacklinuxer  阅读(519)  评论(0编辑  收藏  举报