buddyinfo 内存碎片数据采集

Buddyinfo.sh 脚本解析
本文介绍了一个名为buddyinfo.sh的Shell脚本,该脚本用于监控和展示Linux系统的内存分配情况,特别是不同层级的伙伴系统内存块状态。通过定时收集/proc/buddyinfo中的数据并进行计算,输出了各个层级的内存使用情况,有助于理解系统内存管理机制。

不说了,上工具

#cat    buddyinfo.sh
#!/bin/sh
#****************************************************************#
# ScriptName: buddyinfo.sh
# Author: $SHTERM_REAL_USER@alibaba-inc.com
# Create Date: 2017-04-26 15:47
# Modify Author: $SHTERM_REAL_USER@alibaba-inc.com
# Modify Date: 2017-04-26 15:47
# Function:
#***************************************************************#

BC_MUTI(){
    #subtraction
    if [[ -n $1 && -n $2 ]];then
        res1=$(printf "%.2f" `echo "scale=2;($1*$2)"|bc`)
        echo $res1
    fi
}

MESG(){
  local GROUP="$1"
  local KEY=$2
  local VALUE=$3
  local MEASURE=$4

  if [[ -n $VALUE ]];then
      echo -e "$(date "+%F %H:%M:%S"),$GROUP,$KEY,$VALUE,$MEASURE"  >> $REAL_LOG
      return 0
  fi
}

BC_BUDDY(){
    aa=$1
    bb=$2
    let "res1=$aa*2**$bb"
    echo $res1
}

CONVERT_BUDDY_VALUE(){
    start=$1
    MAX=`cat /proc/buddyinfo  | grep "Normal"| awk -F"Normal" '{print $2}'|awk '{print NF}'`
    MAX=`echo "$MAX - 1" | bc`
    buddy_values=`cat /proc/buddyinfo  | grep "Normal"| awk -F"Normal" '{print $2}'`
    array2=(
        $buddy_values
    )
  bb=`echo ${array2[@]:$start:$MAX}`

    count=0
    final_vvv=0
    for value in ${bb[@]};do
        vvv=`BC_BUDDY $value $count`
        count=`echo "$count +1 "|bc`
        final_vvv=`echo "$final_vvv + $vvv"|bc`
    done

    echo  $final_vvv
}

LOOP_VMSTAT(){
    while [[ 0 == 0 ]] ;do
        sleep 1
        CALCULATE_VMSTAT
    done
}

CALCULATE_VMSTAT(){
    timestamp=$(date "+%Y-%m-%d-%H:%M:%S")
    order1=`CONVERT_BUDDY_VALUE 1`
    order2=`CONVERT_BUDDY_VALUE 2`
    order3=`CONVERT_BUDDY_VALUE 3`
    order4=`CONVERT_BUDDY_VALUE 4`
    order5=`CONVERT_BUDDY_VALUE 5`
    order6=`CONVERT_BUDDY_VALUE 6`
    order7=`CONVERT_BUDDY_VALUE 7`
    order8=`CONVERT_BUDDY_VALUE 8`
    order9=`CONVERT_BUDDY_VALUE 9`
    order10=`CONVERT_BUDDY_VALUE 10`
    printf "%-20s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s\n" $timestamp $order1 $order2 $order3 $order4 $order5 $order6 $order7 $order8 $order9 $order10
}
main(){
     printf "%-20s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s\n" "timestamp" "order1" "order2" "order3" "order4" "order5" "order6" "order7" "order8" "order9" "order10"
     LOOP_VMSTAT
}
main
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#sh   buddyinfo.sh
timestamp            order1  order2  order3  order4  order5  order6  order7  order8  order9  order10

2017-04-26-20:53:20  9952240 4975948 2487866 1243711 621496  309892  154207  76867   38313   19124
2017-04-26-20:53:22  9952309 4975928 2487861 1243712 621496  309892  154207  76867   38313   19124
2017-04-26-20:53:23  9952392 4975970 2487869 1243713 621496  309892  154207  76867   38313   19124
2017-04-26-20:53:24  9952429 4975992 2487877 1243713 621496  309892  154207  76867   38313   19124
2017-04-26-20:53:26  9952449 4975993 2487879 1243713 621496  309892  154207  76867   38313   19124
2017-04-26-20:53:27  9952485 4975998 2487880 1243713 621496  309892  154207  76867   38313   19124
2017-04-26-20:53:28  9952490 4976003 2487883 1243715 621497  309892  154207  76867   38313   19124
2017-04-26-20:53:29  9952475 4975996 2487882 1243716 621498  309892  154207  76867   38313   19124
2017-04-26-20:53:31  9952404 4975956 2487881 1243716 621498  309892  154207  76867   38313   19124
2017-04-26-20:53:32  9952494 4975998 2487886 1243716 621498  309892  154207  76867   38313   19124

970272-20170426205416350-517314710.png

转载于:https://www.cnblogs.com/muahao/p/6770014.html

### 内存碎片整理方法 内存碎片是指已分配的内存块之间存在的未使用的小块空闲内存。当内存碎片过多时,可能会导致内存不连续,造成内存分配效率下降。内存碎片整理是一种技术,它尝试通过移动已分配的内存页来合并小块的空闲内存,以便为较大的内存请求提供连续的内存区域[^3]。 #### Linux 内核中的内存碎片整理 在 Linux 内核中,内存碎片整理通过 **内存压缩**(Memory Compaction)技术实现。该机制通过移动内存页来减少内存碎片,从而为大块内存分配提供连续的物理内存。整理过程涉及两个指针: - **头指针**:从内存区域的起始位置向尾部扫描,寻找可移动的页。 - **尾指针**:从内存区域的末尾向头部扫描,寻找空闲的页。 当这两个指针相遇时,表示整理过程完成。在整理过程中,可移动的页会被迁移到空闲区域,从而将空闲内存集中在一起,形成更大的连续内存块[^1]。 Linux 内核中可以通过配置 `CONFIG_COMPACTION` 来启用内存压缩功能,并且可以通过 `/proc/sys/vm/compact_memory` 文件触发手动压缩操作。例如: ```bash echo 1 > /proc/sys/vm/compact_memory ``` 该命令会触发整个系统的内存压缩操作,帮助减少内存碎片[^3]。 #### Redis 中的内存碎片整理 在 Redis 中,内存碎片的形成主要与内存分配器的实现方式有关。Redis 默认使用 `jemalloc` 作为内存分配器,其分配策略是基于固定大小的内存块进行管理,而不是完全按照应用程序申请的大小进行分配。这种分配方式可能导致内存浪费,形成内部碎片[^4]。 Redis 提供了自动清理内存碎片的功能,该功能依赖于 `jemalloc` 的特性。核心机制是:不从线程缓存中获取内存,而是重新申请一块新的内存,并将旧的内存释放。通过这种方式,可以有效地将分散的碎片内存合并,提升内存利用率[^2]。 Redis 4.0 及以上版本支持在线内存碎片整理,可以通过配置 `maxmemory` 和 `maxmemory-policy` 来控制内存使用和回收策略。此外,Redis 6.0 引入了 `MEMORY PURGE` 命令,用于主动触发内存释放操作,适用于使用 `jemalloc` 分配器的环境。 #### 应用层优化策略 除了操作系统和内存分配器层面的内存碎片整理机制,应用程序也可以通过以下方式进行优化: - **内存池管理**:预先分配大块内存并进行内部管理,避免频繁调用 `malloc` 和 `free`。 - **对象复用**:使用对象池技术复用已分配的对象,减少内存分配和释放的频率。 - **选择合适的内存分配器**:例如 `jemalloc` 或 `tcmalloc`,它们在内存管理上比标准 `malloc` 更高效,能够减少碎片的产生[^4]。 --- ### 示例:手动触发 Linux 内存压缩 以下是一个 Bash 脚本示例,用于手动触发 Linux 内存压缩并监控 `/proc/buddyinfo` 的变化: ```bash #!/bin/bash echo "Triggering memory compaction..." echo 1 > /proc/sys/vm/compact_memory echo "Monitoring buddyinfo..." while [ $i -le 5 ]; do cat /proc/buddyinfo echo "-----------------------------" sleep 2 i=$((i+1)) done ``` 该脚本会触发内存压缩操作,并每隔 2 秒输出一次 `/proc/buddyinfo` 的内容,便于观察内存碎片整理前后空闲内存块的变化。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值