/bin/bash # 获取要监控的本地服务器IP地址 IP=`ifconfig $4 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` mem_total=`grep Mem $1 | sed -n ${i}"p" | awk '{print $2}' | cut -f 1 -d 'k'` #echo "物理内存总量:"$mem_total $6}' | cut -f 1 -d 'k'` #echo "剩余内存总量(操作系统):"$mem_sys_free # 获取应用程序已使用的内存总量 mem_buffers=`grep Mem $1 \t\t%.2f\t\t%.2f\t\t\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n" $disk_sda_rs $disk_sda_ws $disk_sda_avgqu_sz $disk_sda_await 注:针对不同类型、版本的操作系统,以上脚本可能需要做适当修改才可适用 附脚本下载地址:Linux 性能监控之CPU&内存&I/O监控Shell脚本2.zip
写在前面 博文内容涉及 Linux 全局内存监控 监控方式包括传统工具 vmstat/top/free/sar/slabtop ,以及 systemd-cgtop,proc 内存伪文件系统 监控内容包括系统内存使用 ----《明朝那些事儿》 持续分享技术干货,感兴趣小伙伴可以关注下 ^_^ 内存的全局监控 内存资源的全局监控一般用于系统级别内存数据实时观测,用于快速定位内存瓶颈(如内存使用率持续超过80%或Swap 在学习实际的监控方式之前,我们先来看几个内存相关的术语 交换(物理内存不足) 所有系统RAM芯片的物理内存容量都是固定的。 实时监控 Linux 内核 SLAB 缓存,间隔2s,对缓存进行排序 ┌──[root@liruilongs.github.io]-[~] └─$ slabtop -d 2 -s c Active / Hugepagesize:a 的大小hugepage(在基于 Intel 的系统上通常为 2MB) /proc/slabinfo 前面 slabtop 的数据源,slabinfo 是 Linux 内核提供的用于监控和管理
维护一个表,记录与待查询进程相关的子进程及其内存,初始化只有待查询进程 遍历所有进程: 如果当前进程的父进程在表中: 将此进程及对应内存加入表 interval>\n"; exit(-1); } int root_pid = stoi(argv[1]); int interval = stoi(argv[2] /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,并且配置相关参数。 ,默认是0 重启zabbix-server systemctl restart zabbix-server 2.配置tomcat服务器 由于我是直接jar包运行,直接通过启动参数设置即可, 第二步,添加你需要的监控项即可 ? 这里选取四项,查看效果图 ? ok,其余的配置再摸索,监控多个java进程的jvm还须研究
这里我们简单看看下上面提到的几个BPF关键名词: 动态跟踪点: kprobes 和 uprobes,类似于内核态和用户态的方法埋点,比较灵活,可以任意监控 kprobes: 通过在内核函数入口或指定指令位置插入断点指令 例如,可监控 kmalloc、kfree 等内核内存管理函数的行为。 uprobes: 通过修改用户程序的 ELF 文件指令,在库函数(如 malloc)或应用程序的自定义内存分配器处插入探测点。 静态跟踪点:USDT 探针,用户态会将稳定的事件名字编码到软件代码中,监控点都是编译的时候写死的 USDT :探针在程序编译阶段通过宏定义(如 dtrace_probe、stap_probe)插入代码中 , anon2mmap(PID=13365)尝试分配大量内存,导致系统内存耗尽。 BCC 工具,可以跟踪 SystemV的共享内存系统调用:shmget(2)、shmat(2)、shmdt(2)以及 shmctl(2)。
微信急需一个有效的内存监控工具来发现问题。 一 实现原理 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配,每隔1秒 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 2.数据存储 存活对象管理 APP在运行期间会大量申请/释放内存。以上图为例,微信启动10秒内,已经创建了80万对象,释放了50万,性能问题是个挑战。另外在存储过程中,也尽量减少内存申请/释放。 3.数据上报 由于内存监控是存储了当前所有存活对象的内存分配信息,数据量极大,所以当出现FOOM时,不可能全量上报,而是按某些规则有选择性的上报。
本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题。 ---------- FOOM(Foreground Out Of Memory),是指App在前台因消耗内存过多引起系统强杀。 微信急需一个有效的内存监控工具来发现问题。 一、实现原理 ------ 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 [2.png] 另外为了更好的归类数据,每个内存对象应该有它所属的分类Category,如上图所示。
微信急需一个有效的内存监控工具来发现问题。 一 实现原理 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配,每隔1秒 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 2.数据存储 存活对象管理 APP在运行期间会大量申请/释放内存。以上图为例,微信启动10秒内,已经创建了80万对象,释放了50万,性能问题是个挑战。另外在存储过程中,也尽量减少内存申请/释放。 3.数据上报 由于内存监控是存储了当前所有存活对象的内存分配信息,数据量极大,所以当出现FOOM时,不可能全量上报,而是按某些规则有选择性的上报。
WeTest 导读 目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段。本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题。 微信急需一个有效的内存监控工具来发现问题。 一 实现原理 微信内存监控最初版本是使用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hook malloc/free等接口监控堆内存分配,每隔1秒 不过这方案有不少缺点: 1、监控粒度不够细,像大量分配小内存引起的质变无法监控,另外fishhook只能hook自身app的C接口调用,对系统库不起作用; 2、打log间隔不好控制,间隔过长可能丢失中间峰值情况 3.数据上报 由于内存监控是存储了当前所有存活对象的内存分配信息,数据量极大,所以当出现FOOM时,不可能全量上报,而是按某些规则有选择性的上报。
该shell脚本主要用于监控: 1.各个进程的jvm内存使用情况; 2.端口监控; 3.访问的页面是否正常。 '{print $1}'` do addr=`ifconfig -a|grep -w inet|grep -v 127.0.0.1|grep -v 172.16.1.1|awk '{print $2} *-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内存值 : [bech8l6wx7.jpeg] [475ldqsxa2.png]
打开防火墙 打开本地(RabbitMQ Server)防火墙 [root@rabbitmq ~]# netstat -ant | grep 15672 tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN [root@rabbitmq ~]# iptables -L -nv | grep 15672 [root@rabbitmq ~]# grep 15672 /etc/sysconf
这里提示我们系统里没有安装 php ,我们给它装上,同时我们也装上 php-mysql ,它提供了php 连接 mysql 需要的DBI
0 [root@es_node tengine-2.1.2]# ll /usr/local/nginx/ total 24 drwxr-xr-x 2 root root 4096 Jan 6 19:46 conf drwxr-xr-x 2 root root 4096 Jan 6 19:46 html drwxr-xr-x 2 root root 4096 Jan 6 19:46 include drwxr-xr-x 2 root root 4096 Jan 6 19:46 logs drwxr-xr-x 2 root root 4096 Jan 6 19:46 modules drwxr-xr-x 2 root root 4096 Jan 6 19:46 sbin [root@es_node tengine-2.1.2]#
示例:点击 -> 性能监控 /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监控代码 insert_sql="""insert into `monitor_mem_use` (`used`,`free`,`cached`,`buffers`,`flow_time`) values ({0},{1},{2}
写在前面 博文内容涉及 使用 eBPF 监控内存 OOM killer 事件,并且采集当前系统的部分相关指标数据 介绍了传统的监控方式以及使用 BPF/eBPF 的方式 关于 OOM killer 是什么 Static hostname: developer Icon name: computer-vm Chassis: vm Machine ID: 7ad73f2b5f7046a2a389ca780f472467 传统的 OOM Killer 内存事件监控 传统的 OOM killer 历史数据查看一般通过内核日志,或者是Cgroup 内存子系统的事件计数器。 用内存测试工具简单复现一下 OOM killer,我们看看如何监控,这里需要把交换分区禁用掉,要不换页进程(kswapd)疯狂的输出,不太容易触发 OOM Killer [root@liruilongs.github.io /oomkill.bt Attaching 2 probes... Tracing oom_kill_process()...
本篇提到的监控环境是有条件的,即默认单机只运行一个redis实例,且默认运行的端口是6379(也可以是其他端口,需要通过sed -i ‘s/6379/你修改的端口/g’ xml模板文件 修改模板文件里的端口号 2、客户端key配置 在被监控的主机上,打开/etc/zabbix/zabbix_agentd.conf 配置文件,在最后一行加入: UserParameter=redis_stats[*],redis-cli -h 127.0.0.1 -p $1 info|grep $2|cut -d : -f2 配置完成后通过/etc/init.d/zabbix_agentd restart 重启服务并应用最新的配置文件 # zabbix_get -s 172.20.0.20 -k redis_stats[6379,total_connections_received] 2249669 上面正常从被监控主机上取得了数据, 5、查看监控图 通过monitoring —– graphs 可以查看刚刚添加的监控项的监控图,这里只截下内存使用情况图 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
所以,监控 Redis 的内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis 至关重要。 当主从节点之间网络延迟较高或主节点挂载大量从节点时这部分内存消耗将占用很大一部分,建议主节点挂载的从节点不要多于 2 个,主从节点不要部署在较差的网络环境下,如异地跨机房环境,防止复制客户端连接缓慢造成溢出 输入输出缓冲区在大流量场景中容易失控,造成 Redis 内存不稳定,需要重点监控。可以定期执行 client list 命令,监控每个客户端的输入输出缓冲区大小和其他信息。 2MB。 它虽然可以加快 fork 速度( 要拷贝的页的数量减少 ),但是会导致 copy-on-write 复制内存页的单位从 4KB 增大为 2MB,如果父进程有大量写命令,会加重内存拷贝量,都是修改一个页的内容
种数据库都有它自己的内存机制,如果说汽车的三大件,发动机,变速箱,底盘。数据库的内存机制算是数据库核心的核心,一个没有好的内存管理和分配的数据库,一定是不会有好的性能。 关于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 内存相关的指标。 当主从节点之间网络延迟较高或主节点挂载大量从节点时这部分内存消耗将占用很大一部分,建议主节点挂载的从节点不要多于 2 个,主从节点不要部署在较差的网络环境下,如异地跨机房环境,防止复制客户端连接缓慢造成溢出 输入输出缓冲区在大流量场景中容易失控,造成 Redis 内存不稳定,需要重点监控。可以定期执行 client list 命令,监控每个客户端的输入输出缓冲区大小和其他信息。 ? 2MB。 它虽然可以加快 fork 速度( 要拷贝的页的数量减少 ),但是会导致 copy-on-write 复制内存页的单位从 4KB 增大为 2MB,如果父进程有大量写命令,会加重内存拷贝量,都是修改一个页的内容