写在前面 博文内容涉及 Linux 全局内存监控 监控方式包括传统工具 vmstat/top/free/sar/slabtop ,以及 systemd-cgtop,proc 内存伪文件系统 监控内容包括系统内存使用 ----《明朝那些事儿》 持续分享技术干货,感兴趣小伙伴可以关注下 ^_^ 内存的全局监控 内存资源的全局监控一般用于系统级别内存数据实时观测,用于快速定位内存瓶颈(如内存使用率持续超过80%或Swap 频繁触发),避免因内存不足导致的响应延迟或服务中断,这里我们也介绍几种方式,关于 通过 BPF 实现全局内存监控会单独拿出来讲。 在学习实际的监控方式之前,我们先来看几个内存相关的术语 交换(物理内存不足) 所有系统RAM芯片的物理内存容量都是固定的。 sar 上面讲的系统内存监控工具都是实时工具,有时候可能当尝试去解决问题的时候,问题已经发生完成了,即错过了解决问题的最佳时机,所以我们需要查看历史监控数据,所以就有了 sar sar [-B][-rl
缘由 需要获取某程序运行过程中的内存消耗,一般情况可以使用 top 命令来人工分析,不过我遇到一个程序其内部调用包括 python, R, 以及一系列 linux 命令,这就导致人工统计不太现实 问题变成统计进程及其子进程的内存使用 维护一个表,记录与待查询进程相关的子进程及其内存,初始化只有待查询进程 遍历所有进程: 如果当前进程的父进程在表中: 将此进程及对应内存加入表 /pm 25201 2 监控 id 为25201的进程,刷新间隔为2秒 结果输出: 2020-09-18 17:37:05 1932 2020-09-18 17:37:07 1932 2020-09-18 17:37:09 1932 这里输出的内存单位是 KB 注意:由于需要进程启动之后才能开启监控,导致进程内存无法从0开始;当进程结束,则监控程序也会退出 关于结果展示,直接将输出结果的第二列和第三列拷贝到 Excel 中,插入折线图即可看到内存随时间变化情况
写在前面 博文内容涉及 Linux 进程内存监控 监控方式包括传统工具 ps/top/pmap ,以及 cgroup 内存子系统,proc 内存伪文件系统 监控内容包括进程内存使用情况, 内存全局数据统计 ,内存事件指标,以及进程内存段数据监控 理解不足小伙伴帮忙指正 :),生活加油 我看远山,远山悲悯 持续分享技术干货,感兴趣小伙伴可以关注下 ^_^ 监控进程的内存使用量 这里分析的工具主要是原生工具 ,后面还会分享一些 BPF 相关的内存观察工具以及系统内存的全局监控 PS/TOP 一般的内存监控工具,对于进程级别的,会使用如 ps/top 命令, 通过指标 VIRT 或 VSZ 和 RES 或 RSS 内存详细信息指标监控 下面一组是内存详细信息的数据统计 参数 作用 memory.numa_stat NUMA 节点的内存使用统计(适用于多 CPU 架构)。 内存事件指标监控 下面为内存事件指标依次来看一下 参数 作用 memory.usage_in_bytes 当前物理内存使用量(包括匿名内存、文件缓存等)。
Zabbix自带监控系统的内存利用率和CPU利用率,但是系统内存并不能反应JVM内存情况 在本地我们可以通过jconsole或者jvisualvm进行监控jvm内存情况 不过正是环境一般都是部署在linux 再通过命令进行查看,比如查看非堆内存使用情况 java -jar cmdline-jmxclient-0.10.3.jar - 39.105.97.50:12345 java.lang:type=Memory jvm内存情况集成jmx步骤逻辑 在zabbix服务器上安装配置zabbix-java-gateway,并且配置相关参数。 如果是红色,查看具体原因,可能是端口暴露问题,或者是启动的参数设置问题 5.自定义图形和监控项 jmx为绿色,标志着添加成功,之后自定义图形,设置监控项即可 第一步创建图形 ? 第二步,添加你需要的监控项即可 ? 这里选取四项,查看效果图 ? ok,其余的配置再摸索,监控多个java进程的jvm还须研究
全系统范围内创建了哪些内存映射,哪些应用程序代码路径正在申请内存分配? 内存溢出(OOM Kil)事件发生时系统状态如何? 是否有分配一段时间后还是没有释放的内存,定位可能内存泄露的进程? 这里我们简单看看下上面提到的几个BPF关键名词: 动态跟踪点: kprobes 和 uprobes,类似于内核态和用户态的方法埋点,比较灵活,可以任意监控 kprobes: 通过在内核函数入口或指定指令位置插入断点指令 例如,可监控 kmalloc、kfree 等内核内存管理函数的行为。 uprobes: 通过修改用户程序的 ELF 文件指令,在库函数(如 malloc)或应用程序的自定义内存分配器处插入探测点。 静态跟踪点:USDT 探针,用户态会将稳定的事件名字编码到软件代码中,监控点都是编译的时候写死的 USDT :探针在程序编译阶段通过宏定义(如 dtrace_probe、stap_probe)插入代码中 )持续申请内存,导致系统物理内存耗尽。
微信急需一个有效的内存监控工具来发现问题。 一 实现原理 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配,每隔1秒 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 修改malloc_default_zone函数返回的malloc_zone_t结构体里的malloc、free等函数指针,也是可以监控堆内存分配,效果等同于malloc_logger;而虚拟内存分配只能通过 3.数据上报 由于内存监控是存储了当前所有存活对象的内存分配信息,数据量极大,所以当出现FOOM时,不可能全量上报,而是按某些规则有选择性的上报。
本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题。 ---------- FOOM(Foreground Out Of Memory),是指App在前台因消耗内存过多引起系统强杀。 微信急需一个有效的内存监控工具来发现问题。 一、实现原理 ------ 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 [8.png] 3.数据上报 由于内存监控是存储了当前所有存活对象的内存分配信息,数据量极大,所以当出现FOOM时,不可能全量上报,而是按某些规则有选择性的上报。
微信急需一个有效的内存监控工具来发现问题。 一 实现原理 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配,每隔1秒 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 修改malloc_default_zone函数返回的malloc_zone_t结构体里的malloc、free等函数指针,也是可以监控堆内存分配,效果等同于malloc_logger;而虚拟内存分配只能通过 3.数据上报 由于内存监控是存储了当前所有存活对象的内存分配信息,数据量极大,所以当出现FOOM时,不可能全量上报,而是按某些规则有选择性的上报。
该shell脚本主要用于监控: 1.各个进程的jvm内存使用情况; 2.端口监控; 3.访问的页面是否正常。 *-Dweblogic.Name=//g'|awk '{print $1}'` #jvm内存监控 echo ############################################## BEGIN{printf "%.0f\n",x*y}'` perm1=`gawk -v x=$perm -v y=1000 'BEGIN{printf "%.0f\n",x*y}'` #取对应进程的jvm内存值 perm1} -ge "99999" ] then jvm=$jvm+${name1}+":Perm Generation:"+${perm}+"%超阀值 " fi echo $jvm done #端口监控 an |grep $port|grep LISTEN|grep $addr` if [ "$net" = "" ] then p1=$p1+${port}+"端口异常" fi done #url监控
WeTest 导读 目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段。本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题。 微信急需一个有效的内存监控工具来发现问题。 一 实现原理 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配,每隔1秒 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 3.数据上报 由于内存监控是存储了当前所有存活对象的内存分配信息,数据量极大,所以当出现FOOM时,不可能全量上报,而是按某些规则有选择性的上报。
8-2 图的存储结构 1.邻接矩阵(顺序存储结构) 图结构的元素之间虽然具有“多对多”的关系,但是同样可以采用顺序存储,即使用数组有效地存储图。
5.堆内存与直接内存默认为“4G、24G”,用户也可以根据实际情况进行调整但输入范围不得超过【1-64】G。当堆内存大于8G时,建议打开G1垃圾回收器。 使用脚本方式部署暂无软件列表 3.数量:使用脚本方式部署时统一展示“-” 4.安装状态: 保存信息:未安装 脚本开始执行后:正在安装 脚本执行无异常:无异常信息 5.启动状态:使用脚本方式部署暂无状态监控
示例:点击 -> 性能监控 /proc/meminfo used=total-(buffers+cached+free) [root@wangzi go]# cat /proc/meminfo MemTotal 77724 kB MemAvailable: 51692 kB Buffers: 8468 kB Cached: 59584 kB python监控代码
写在前面 博文内容涉及 使用 eBPF 监控内存 OOM killer 事件,并且采集当前系统的部分相关指标数据 介绍了传统的监控方式以及使用 BPF/eBPF 的方式 关于 OOM killer 是什么 传统的 OOM Killer 内存事件监控 传统的 OOM killer 历史数据查看一般通过内核日志,或者是Cgroup 内存子系统的事件计数器。 yes 使用 BPF 的方式 对于 BPF 的监控,主要通过 BPF 和 bpftrace 的 oomkill 工具,我们可以在触发 OOM killer 事件之后,观察到系统平均负载等一些其他的信息 用内存测试工具简单复现一下 OOM killer,我们看看如何监控,这里需要把交换分区禁用掉,要不换页进程(kswapd)疯狂的输出,不太容易触发 OOM Killer [root@liruilongs.github.io :"); cat("/proc/meminfo"); } 修改脚本后的再次监控指标采集 [root@developer tools]# vim oomkill.bt [root@developer
本篇提到的监控环境是有条件的,即默认单机只运行一个redis实例,且默认运行的端口是6379(也可以是其他端口,需要通过sed -i ‘s/6379/你修改的端口/g’ xml模板文件 修改模板文件里的端口号 2、客户端key配置 在被监控的主机上,打开/etc/zabbix/zabbix_agentd.conf 配置文件,在最后一行加入: UserParameter=redis_stats[*],redis-cli # zabbix_get -s 172.20.0.20 -k redis_stats[6379,total_connections_received] 2249669 上面正常从被监控主机上取得了数据, 5、查看监控图 通过monitoring —– graphs 可以查看刚刚添加的监控项的监控图,这里只截下内存使用情况图 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
所以,监控 Redis 的内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis 至关重要。 防止所用的内存超过服务器物理内存,导致 OOM 后进程被系统杀死。 maxmemory 限制的是 Redis 实际使用的内存量,也就是 used_memory 统计项对应的内存。 所以,如果你有 10GB 的内存,最好将 maxmemory 设置为 8 或者 9G 内存消耗划分 Redis 进程内消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片,其中 Redis [1240] 对象内存 对象内存是 Redis 内存占用最大的一块,存储着用户所有的数据。 输入输出缓冲区在大流量场景中容易失控,造成 Redis 内存不稳定,需要重点监控。可以定期执行 client list 命令,监控每个客户端的输入输出缓冲区大小和其他信息。
种数据库都有它自己的内存机制,如果说汽车的三大件,发动机,变速箱,底盘。数据库的内存机制算是数据库核心的核心,一个没有好的内存管理和分配的数据库,一定是不会有好的性能。 关于MYSQL的内存,这个话题比较大,只能限定INNODB 操作因为的数据库内存的分析。 是的内存在数据库中其实就是为了性能,试想如果磁盘的速度和内存一样快,还需要内存,buffer pool ,缓存吗? 2 Buffer pool 缓存,内存,到底在MYSQL 中起到了什么作用? 5 内存中的数据是否有退出机制? 回答是一定的,任何数据库的内存的数据都有退出的机制,否则内存难道要和数据的大小一致,在目前的硬件技术上,这是不大可能的,所以内存必须有退出的机制。 6 内存中涉及管理内存页的是怎么做的 MYSQL 中的内存管理主要使用的是 LRU 算法(变种),Least Recently Used,在MYSQL 的 BUFFER POOL 中是包含 New SUBLIST
所以,监控 Redis 的内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis 至关重要。 ? 内存使用统计 通过 info memory 命令可以获得 Redis 内存相关的指标。 当 Redis 内存超出可以获得内存时,操作系统会进行 swap,将旧的页写入硬盘。从硬盘读写大概比从内存读写要慢5个数量级。 所以,如果你有 10GB 的内存,最好将 maxmemory 设置为 8 或者 9G 内存消耗划分 Redis 进程内消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片,其中 Redis 对象内存 对象内存是 Redis 内存占用最大的一块,存储着用户所有的数据。 输入输出缓冲区在大流量场景中容易失控,造成 Redis 内存不稳定,需要重点监控。可以定期执行 client list 命令,监控每个客户端的输入输出缓冲区大小和其他信息。 ?
所以,监控 Redis 的内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis 至关重要。 内存使用统计 通过 info memory 命令可以获得 Redis 内存相关的指标。 当 Redis 内存超出可以获得内存时,操作系统会进行 swap,将旧的页写入硬盘。从硬盘读写大概比从内存读写要慢5个数量级。 所以,如果你有 10GB 的内存,最好将 maxmemory 设置为 8 或者 9G 内存消耗划分 Redis 进程内消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片,其中 Redis 对象内存 对象内存是 Redis 内存占用最大的一块,存储着用户所有的数据。 输入输出缓冲区在大流量场景中容易失控,造成 Redis 内存不稳定,需要重点监控。可以定期执行 client list 命令,监控每个客户端的输入输出缓冲区大小和其他信息。 ?
free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。 系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。 的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以我们看linux,只要不用swap的交换 空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux 语 法: free [-bkmotV][-s <间隔秒数>] 补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。 参 数: -b 以Byte为单位显示内存使用情况。 -k 以KB为单位显示内存使用情况。 -m 以MB为单位显示内存使用情况。 -o 不显示缓冲区调节列。