zoukankan      html  css  js  c++  java
  • 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:

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

    Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。------应该是这样的

    dd if=/tmp/file of=/dev/null
    dd if=/dev/sda3 of=/dev/null bs=1M count=200
    测试
  • 相关阅读:
    软工实践寒假作业(2/2)
    Java 内存溢出分析
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件测评
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次作业-疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    个人作业——软件工程实践总结&个人技术博客
    配合springboot的快速运维脚本
  • 原文地址:https://www.cnblogs.com/codestack/p/12577640.html
Copyright © 2011-2022 走看看