查线上问题:
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:
Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。
Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。------应该是这样的
dd if=/tmp/file of=/dev/null dd if=/dev/sda3 of=/dev/null bs=1M count=200 测试