Zabbix的各类服务监控
监控端口
一、创建模板,名字随意
应用集略过
二、 新建监控项

或者 net.tcp.port[: 检查是否可以将TCP链接到指定端口,0 - 不能连接,1 - 能连接。ip默认为127.0.0.1
三、创建触发器

上面表达式意思为:1分钟内,返回2次0,即触发。
监控MySQL
简单的监控方式
修改数据库配置文件有两种方式
一、修改默认配置
也就是/etc/my.cnf尾部添加;
[mysql]
host=192.168.1.13
user=admin
password=zabbix@123
[mysqladmin]
host=192.168.1.13
user=admin
password=zabbix@123
建立MySQL可执行文件的软连接,已建立或者已经创建环境变量可忽略(MySQL yum安装忽略):
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/
ln -s /usr/local/mysql/bin/mysqladmin /usr/local/bin/
新建userparameter_mysql.conf 配置文件
# 连接数
UserParameter=mysql.max_connections,echo "show variables where Variable_name='max_connections';" | mysql -N | awk '{print $2}'
UserParameter=mysql.current_connections,echo "show global status where Variable_name='Threads_connected';" | mysql -N | awk '{print $2}'
# 缓冲池
UserParameter=mysql.buffer_pool_size,echo "show variables where Variable_name='innodb_buffer_pool_size';" | mysql -N |awk '{printf "%.2f",$2/1024/1024/1024}'
UserParameter=mysql.buffer_pool_usage_percent,echo "show global status where Variable_name='Innodb_buffer_pool_pages_free' or Variable_name='Innodb_buffer_pool_pages_total';" | mysql -N | awk '{a[NR]=$2}END{printf "%.1f",100-((a[1]/a[2])*100)}'
# 增删改查
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | mysql -N | awk '{print $$2}'
# 实例状态
UserParameter=mysql.ping,mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | mysql --defaults-file=/usr/local/zabbix/etc/my.cnf -N'
二、自定义新的配置文件
建议放在vim etc/zabbix/etc/.my.cnf, 直接命名my.cnf会报错,加上 "."
[client]
user=zabbix
host=localhost
password=123456
建立MySQL可执行文件的软连接,已建立或者已经创建环境变量可忽略(MySQL yum安装忽略):
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/
ln -s /usr/local/mysql/bin/mysqladmin /usr/local/bin/
新建userparameter_mysql.conf 配置文件
# 连接数
UserParameter=mysql.max_connections,echo "show variables where Variable_name='max_connections';" | HOME=/etc/zabbix/ mysql -N | awk '{print $2}'
UserParameter=mysql.current_connections,echo "show global status where Variable_name='Threads_connected';" | HOME=/etc/zabbix/ mysql -N | awk '{print $2}'
# 缓冲池
UserParameter=mysql.buffer_pool_size,echo "show variables where Variable_name='innodb_buffer_pool_size';" | HOME=/etc/zabbix/ mysql -N |awk '{printf "%.2f",$2/1024/1024/1024}'
UserParameter=mysql.buffer_pool_usage_percent, echo "show global status where Variable_name='Innodb_buffer_pool_pages_free' or Variable_name='Innodb_buffer_pool_pages_total';" | HOME=/etc/zabbix/ mysql -N | awk '{a[NR]=$2}END{printf "%.1f",100-((a[1]/a[2])*100)}'
# 增删改查
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/etc/zabbix/ mysql -N | awk '{print $$2}'
# 实例状态
UserParameter=mysql.ping,HOME=/etc/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,HOME=/etc/zabbix/ mysql -V
另外一种监控方式
- 创建一个MySQL日志生成脚本
- 第二个脚本根据传进来的参数对日志过滤
- 编写zabbix监控项文件,传参至第二个脚本
编写定期收集mysql信息脚本,并指定到对应目录
vim mysql_monitor.sh
#!/bin/bash
dbpath='/data/mysql/bin/mysql'
#mysql的用户
dbuser='root'
#mysql的密码
dbpass='123456'
#mysql的端口
dbport='3306'
#mysql的socket文件
dbsocket='/data/mysql/tmp/mysql.sock'
#mysql-status日志路径
dbstatuspath=/tmp/mysql_status_monitor.log
#mysql-engine-status日志路径
dbenginestatuspath=/tmp/mysql_engine_innodb_status.log
#self-define-script
dbselfpath=/tmp/mysql_self_status.log
#查询mysql-status信息
${dbpath} -u${dbuser} -p${dbpass} -S${dbsocket} -P${dbport} -BNe "show global status;" > ${dbstatuspath}
#查询mysql-engine-innodb信息
${dbpath} -u${dbuser} -p${dbpass} -S${dbsocket} -P${dbport} -BNe "show engine innodb status\G" > ${dbenginestatuspath}
#检查集群节点
nodecount=`export MYSQL_PWD=${dbpass};${dbpath} -u${dbuser} --socket=/data/mysql/data/mysql.sock -P${dbport} -BNe "select count(*) from performance_schema.replication_group_members where MEMBER_STATE != 'ONLINE'"`
echo -e "nodecount ${nodecount}" > ${dbselfpath}
编写获取数据脚本,对定时生成的log文件进行信息筛选
vim mysql_get_data.sh
case $1 in
nodecount)
#查询集群节点存活状态
cat /tmp/mysql_self_status.log |awk '/nodecount/ {print $2}' |head -1
;;
uptime)
cat /tmp/mysql_status_monitor.log | awk '/Uptime/ {print $2}' |head -1
;;
com_select)
cat /tmp/mysql_status_monitor.log | awk '/Com_select/ {print $2}'
;;
com_insert)
cat /tmp/mysql_status_monitor.log | awk '/Com_insert/ {print $2}'|head -1
;;
com_update)
cat /tmp/mysql_status_monitor.log | awk '/Com_update/ {print $2}'|head -1
;;
com_delete)
cat /tmp/mysql_status_monitor.log | awk '/Com_delete/ {print $2}'|head -1
;;
connections)
cat /tmp/mysql_status_monitor.log | awk '/Connections/ {print $2}'|head -1
;;
thread_cached)
cat /tmp/mysql_status_monitor.log | awk '/Threads_cached/ {print $2}'
;;
threads_connected)
cat /tmp/mysql_status_monitor.log | awk '/Threads_connected/ {print $2}'
;;
thread_created)
cat /tmp/mysql_status_monitor.log | awk '/Threads_created/ {print $2}'
;;
Threads_running)
cat /tmp/mysql_status_monitor.log | awk '/Threads_running/ {print $2}'
;;
table_locks_immediate)
cat /tmp/mysql_status_monitor.log | awk '/Table_locks_immediate/ {print $2}'
;;
table_locks_waited)
cat /tmp/mysql_status_monitor.log | awk '/Table_locks_waited/ {print $2}'
;;
slow_launch_threads)
cat /tmp/mysql_status_monitor.log | awk '/Slow_launch_threads/ {print $2}'
;;
slow_queries)
cat /tmp/mysql_status_monitor.log | awk '/Slow_queries/ {print $2}'
;;
qps)
uptime=`cat /tmp/mysql_status_monitor.log | awk '/Uptime/ {print $2}' |head -1`
questions=`cat /tmp/mysql_status_monitor.log | awk '/Questions/ {print $2}'`
echo $(printf "%.2f" `echo "scale=2;${questions}/${uptime}"|bc`)
;;
tps)
uptime=`cat /tmp/mysql_status_monitor.log | awk '/Uptime/ {print $2}' |head -1`
com_commit=`cat /tmp/mysql_status_monitor.log | awk '/Com_commit/ {print $2}'`
com_rollback=`cat /tmp/mysql_status_monitor.log | awk '/Com_rollback/ {print $2}'|head -1`
com_sum=$((${com_commit}+${com_rollback}))
echo $(printf "%.2f" `echo "scale=2;${com_sum}/${uptime}"|bc`)
;;
innodb_buffer_read_hits)
innodb_buffer_pool_reads=`cat /tmp/mysql_status_monitor.log | awk '/Innodb_buffer_pool_reads/ {print $2}'|head -1`
innodb_buffer_pool_read_requests=`cat /tmp/mysql_status_monitor.log | awk '/Innodb_buffer_pool_read_requests/ {print $2}'|head -1`
innodb_buffer_read_diff=$((${innodb_buffer_pool_read_requests}-${innodb_buffer_pool_reads}))
echo $(printf "%.2f" `echo "scale=2;${innodb_buffer_read_diff}/${innodb_buffer_pool_read_requests}"|bc`)
;;
table_cache_hit)
cat /tmp/mysql_status_monitor.log | awk '/Opened_tables/ {print $2}'
;;
thread_cache_hits)
thread_created=`cat /tmp/mysql_status_monitor.log | awk '/Threads_created/ {print $2}'`
connections=`cat /tmp/mysql_status_monitor.log | awk '/Connections/ {print $2}'|head -1`
thread_cache_diff=$((${connections}-${thread_created}))
echo $(printf "%.2f" `echo "scale=2;${thread_cache_diff}/${connections}"|bc`)
;;
create_tmp_tables_hits)
created_tmp_tables=`cat /tmp/mysql_status_monitor.log | awk '/Created_tmp_tables/ {print $2}'`
created_tmp_disk_tables=`cat /tmp/mysql_status_monitor.log | awk '/Created_tmp_disk_tables/ {print $2}'`
echo $(printf "%.2f" `echo "scale=2;${created_tmp_disk_tables}/${created_tmp_tables}"|bc`)
;;
binlog_cache_disk_use)
cat /tmp/mysql_status_monitor.log | awk '/Binlog_cache_disk_use/ {print $2}'
;;
table_locks_immediate)
cat /tmp/mysql_status_monitor.log | awk '/Table_locks_immediate/ {print $2}'
;;
table_locks_waited)
cat /tmp/mysql_status_monitor.log | awk '/Table_locks_waited/ {print $2}'
;;
innodb_row_lock_waits)
cat /tmp/mysql_status_monitor.log | awk '/Innodb_row_lock_waits/ {print $2}'
;;
*)
;;
esac
编写zabbix监控项文件, 通过zabbix/script/mysql_get_data.sh脚本去获取对应监控的数值
vim mysql_monitor_parameter.conf
#集群节点数量
UserParameter=nodecount[*],sh /usr/local/zabbix/script/mysql_get_data.sh nodecount
#系统运行时间
UserParameter=uptime[*],sh /usr/local/zabbix/script/mysql_get_data.sh uptime
#查看select语句的执行数
UserParameter=com_select[*],sh /usr/local/zabbix/script/mysql_get_data.sh com_select
#查看insert语句的执行数
UserParameter=com_insert[*],sh /usr/local/zabbix/script/mysql_get_data.sh com_insert
#查看update语句的执行数
UserParameter=com_update[*],sh /usr/local/zabbix/script/mysql_get_data.sh com_update
#查看delete语句的执行数
UserParameter=com_delete[*],sh /usr/local/zabbix/script/mysql_get_data.sh com_delete
#查看试图连接到MySQL(不管是否连接成功)的连接数
UserParameter=connections[*],sh /usr/local/zabbix/script/mysql_get_data.sh connections
#查看线程缓存内的线程的数量
UserParameter=thread_cached[*],sh /usr/local/zabbix/script/mysql_get_data.sh thread_cached
#当线程打开连接数
UserParameter=threads_connected[*],sh /usr/local/zabbix/script/mysql_get_data.sh threads_connected
#查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值
UserParameter=thread_created[*],sh /usr/local/zabbix/script/mysql_get_data.sh thread_created
#查看激活的(非睡眠状态)线程数
UserParameter=threads_running[*],sh /usr/local/zabbix/script/mysql_get_data.sh threads_running
#查看创建时间超过slow_launch_time秒的线程数。
UserParameter=slow_launch_threads[*],sh /usr/local/zabbix/script/mysql_get_data.sh slow_launch_threads
#查看查询时间超过long_query_time秒的查询的个数。
UserParameter=slow_queries[*],sh /usr/local/zabbix/script/mysql_get_data.sh slow_queries
#在服务器上执行语句的数量,只包括客户端发送给服务器的语句,并不包括存储项目执行的语句
UserParameter=qps[*],sh /usr/local/zabbix/script/mysql_get_data.sh qps
#事物提交数量com_commit
#事物回滚数量com_rollback
UserParameter=tps[*],sh /usr/local/zabbix/script/mysql_get_data.sh tps
#在buffer pool满足不了逻辑读的请求,而必须直接从硬盘读取的数量innodb_buffer_pool_reads
#逻辑读的请求数innodb_buffer_pool_read_requests
#buffer_read命中率
UserParameter=innodb_buffer_read_hits[*],sh /usr/local/zabbix/script/mysql_get_data.sh innodb_buffer_read_hits
#打开表的数量open_tables
#已经打开表的数量opened_tables
#table_cache命中率
UserParameter=table_cache_hit[*],sh /usr/local/zabbix/script/mysql_get_data.sh table_cache_hit
#thread_cache命中率
UserParameter=thread_cache_hits[*],sh /usr/local/zabbix/script/mysql_get_data.sh thread_cache_hits
#执行语句过程中创建的临时表created_tmp_tables
#当创建的内部临时表过大,mysql会自动将表从内存中转换为磁盘上的表created_tmp_disk_tables
#在磁盘上创建临时表的比例
UserParameter=create_tmp_tables_hits[*],sh /usr/local/zabbix/script/mysql_get_data.sh create_tmp_tables_hits
#事物使用binlog但是临时二进制日志超过binlog_cache_size,使用临时文件存储事物的语句,如果该值不为0,需要调整binlog_cache_size
UserParameter=binlog_cache_disk_use[*],sh /usr/local/zabbix/script/mysql_get_data.sh binlog_cache_disk_use
#可以立即授予表锁请求的次数
UserParameter=table_locks_immediate[*],sh /usr/local/zabbix/script/mysql_get_data.sh table_locks_immediate
#一个表锁的请求不能立即被授予,需要等待的次数,如果该值过高,说明数据库有性能问题,应该优化sql语句,表分区或者读写分离
UserParameter=table_locks_waited[*],sh /usr/local/zabbix/script/mysql_get_data.sh table_locks_waited
#操作innodb表等待行数的次数
UserParameter=innodb_row_lock_waits[*],sh /usr/local/zabbix/script/mysql_get_data.sh innodb_row_lock_waits
向 mysql_status.conf 文件中写入如下内容,用于定义 key 的名称:
UserParameter=mysql.status[*],/etc/zabbix/scripts/monitor_mysql.sh $1
UserParameter=mysql.ping,/usr/bin/mysqladmin -uzabbix -pzabbix ping|grep alive|wc -l
UserParameter=mysql.version,mysql -V | cut -f6 -d" " | sed 's/,//'
在zabbix server端使用zabbix_get测试
zabbix_get -s 192.168.1.13 -p 10050 -k mysql.buffer_pool_size
监控Nginx
zabbix默认带有两个nginx的模板,可以直接链接模板使用。本文主要介绍根据实际情况自定义一些监控选项

修改nginx配置文件,为了不影响默认/,添加新的/status
vim /etc/nginx/nginx.conf
location /status {
stub_status on;
access_log off;
allow 127.0.0.1; #允许主机访问(同agent)
allow 192.168.1.111; #允许zabbix-server端访问
allow 192.168.1.113; #允许zabbix-agent端访问
deny all; #禁止其他所有
}
检查nginx配置文件,并重启服务
nginx -t #检查配置文件
nginx -s reload #重启Nginx服务
[root@nginx conf]# curl -I 192.168.1.113/nginx_status
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sat, 15 Feb 2020 08:41:57 GMT
Content-Type: text/plain
Connection: keep-alive
[root@nginx conf]# curl 192.168.1.113/nginx_status
Active connections: 1
server accepts handled requests
1191 1191 1124
Reading: 0 Writing: 1 Waiting: 0
Nginx状态解释:
Activeconnections: 对后端发起的活动连接数;server accepts 1191:nginx 总共处理了1191个连接;handled:成功创建了1191次握手;requests:总共处理了1124请求。Reading:nginx读取客户端的header数;Writing: nginx 返回给客户端的header数;Waiting: nginx 请求处理完成,正在等待下一请求指令的连接。
添加nginx监控选项
#拷贝自带的mysql配置文件并修改为nginx
[root@nginx ~]# cd /etc/zabbix/zabbix_agentd.d/
[root@nginx zabbix_agentd.d]# cp userparameter_mysql.conf userparameter_nginx.conf
#删除有关mysql数据,添加nginx监控选项
[root@nginx zabbix_agentd.d]# vi userparameter_nginx.conf
UserParameter=nginx.active,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Active' | awk '{print $NF}'
UserParameter=nginx.reading,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Reading' | awk '{print $2}'
UserParameter=nginx.writing,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Writing' | awk '{print $4}'
UserParameter=nginx.waiting,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Waiting' | awk '{print $6}'
UserParameter=nginx.accepts,curl -s http://127.0.0.1/status 2>/dev/null| awk NR==3 | awk '{print $1}'
UserParameter=nginx.handled,curl -s http://127.0.0.1/status 2>/dev/null| awk NR==3 | awk '{print $2}'
UserParameter=nginx.requests,curl -s http://127.0.0.1/status 2>/dev/null| awk NR==3 | awk '{print $3}'
添加监控选项(依次创建七个监控选项)


创建图形



参考
https://blog.csdn.net/tladagio/article/details/103101807 Zabbix 4.4(五)zabbix监控nginx(自定义nginx监控选项)
监控Redis
创建配置文件
在 /etc/zabbix/zabbix_agentd.d/ 下新建文件 redis_status.conf,内容如下:
#!/bin/bash
REDISCLI="/usr/bin/redis-cli"
HOST="127.0.0.1"
PORT=6379
PASS=""
if [[ $# == 1 ]];then
case $1 in
version)
# 返回redis版本
result=`$REDISCLI -h $HOST -p $PORT info server | grep -w "redis_version" | awk -F':' '{print $2}'`
echo $result
;;
uptime)
# redis服务启动时长
result=`$REDISCLI -h $HOST -p $PORT info server | grep -w "uptime_in_seconds" | awk -F':' '{print $2}'`
echo $result
;;
connected_clients)
# 已连接的客户端数(不包括通过slave连接的客户端)
result=`$REDISCLI -h $HOST -p $PORT info clients | grep -w "connected_clients" | awk -F':' '{print $2}'`
echo $result
;;
blocked_clients)
# 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
result=`$REDISCLI -h $HOST -p $PORT info clients | grep -w "blocked_clients" | awk -F':' '{print $2}'`
echo $result
;;
used_memory)
# 由redis分配器分配的内存总量,以字节为单位
result=`$REDISCLI -h $HOST -p $PORT info memory | grep -w "used_memory" | awk -F':' '{print $2}'`
echo $result
;;
used_memory_rss)
# 返回redis已分配的内存总量
result=`$REDISCLI -h $HOST -p $PORT info memory | grep -w "used_memory_rss" | awk -F':' '{print $2}'`
echo $result
;;
used_memory_peak)
#redis的内存消耗峰值(以字节为单位)
result=`$REDISCLI -h $HOST -p $PORT info memory | grep -w "used_memory_peak" | awk -F':' '{print $2}'`
echo $result
;;
used_memory_lua)
#Lua引擎使用的字节量
result=`$REDISCLI -h $HOST -p $PORT info memory | grep -w "used_memory_lua" | awk -F':' '{print $2}'`
echo $result
;;
used_cpu_sys)
#Redis服务消耗的系统cpu
result=`$REDISCLI -h $HOST -p $PORT info cpu | grep -w "used_cpu_sys" | awk -F':' '{print $2}'`
echo $result
;;
used_cpu_user)
#Redis服务消耗的用户cpu
result=`$REDISCLI -h $HOST -p $PORT info cpu | grep -w "used_cpu_user" | awk -F':' '{print $2}'`
echo $result
;;
used_cpu_sys_children)
#后台进程占用的系统cpu
result=`$REDISCLI -h $HOST -p $PORT info cpu | grep -w "used_cpu_sys_children" | awk -F':' '{print $2}'`
echo $result
;;
used_cpu_user_children)
#后台进程占用的用户cpu
result=`$REDISCLI -h $HOST -p $PORT info cpu | grep -w "used_cpu_user_children" | awk -F':' '{print $2}'`
echo $result
;;
rdb_last_bgsave_status)
#最后一次rdb持久化是否成功
result=`$REDISCLI -h $HOST -p $PORT info Persistence | grep -w "rdb_last_bgsave_status" | awk -F':' '{print $2}' | grep -c ok`
echo $result
;;
aof_last_bgrewrite_status)
#最后一次bgrewrite是否成功
result=`$REDISCLI -h $HOST -p $PORT info Persistence | grep -w "aof_last_bgrewrite_status" | awk -F':' '{print $2}' | grep -c ok`
echo $result
;;
aof_last_write_status)
#上次aof写入状态
result=`$REDISCLI -h $HOST -p $PORT info Persistence | grep -w "aof_last_write_status" | awk -F':' '{print $2}' | grep -c ok`
echo $result
;;
*)
echo -e "\033[33mUsage: $0 {connected_clients|blocked_clients|used_memory|used_memory_rss|used_memory_peak|used_memory_lua|used_cpu_sys|used_cpu_user|used_cpu_sys_children|used_cpu_user_children|rdb_last_bgsave_status|aof_last_bgrewrite_status|aof_last_write_status}\033[0m"
;;
esac
elif [[ $# == 2 ]];then
case $2 in
keys)
result=`$REDISCLI -h $HOST -p $PORT info | grep -w "$1" | grep -w "keys" | awk -F'=|,' '{print $2}'`
echo $result
;;
expires)
result=`$REDISCLI -h $HOST -p $PORT info | grep -w "$1" | grep -w "keys" | awk -F'=|,' '{print $4}'`
echo $result
;;
avg_ttl)
result=`$REDISCLI -h $HOST -p $PORT info | grep -w "$1" | grep -w "avg_ttl" | awk -F'=|,' '{print $6}'`
echo $result
;;
*)
echo -e "\033[33mUsage: $0 {db0 keys|db0 expires|db0 avg_ttl}\033[0m"
;;
esac
fi
注意:若 redis 有密码,则需要在
$HOST后加上-a $PASS参数。
4、脚本授权
[root@localhost scripts]# chmod +x auto_detection_redis_state.sh
5、验证server端验证是否能获取agent端的key值
使用zabbix_get命令获取key值

参数说明
Server
| 参数 | 说明 |
|---|---|
| redis_version:5.0.4 | #redis版本 |
| redis_git_sha1:00000000 | |
| redis_git_dirty:0 | |
| redis_build_id:964fe9af98041665 | |
| redis_mode:standalone | #运行模式,单机或集群 |
| os:Linux 3.10.0-693.21.1.el7.x86_64 x86_64 | #系统版本 |
| arch_bits:64 | #架构,32位或64位 |
| multiplexing_api:epoll | |
| atomicvar_api:atomic-builtin | |
| gcc_version:4.8.5 | #编译redis时所使用的gcc版本 |
| process_id:2939 | #redis服务器的进程id |
| run_id:11b5694d024d8c728c1448ec4163fb0c22b86375 | #redis服务器的随机标识符(用于sentinel和集群) |
| tcp_port:6379 | #redis服务监听端口 |
| uptime_in_seconds:18316 | #redis服务启动时长,单位为秒 |
| uptime_in_days:0 | #redis服务启动时长,单位为天 |
| hz:10 | #redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率 |
| configured_hz:10 | |
| lru_clock:4564768 | |
| executable:/usr/local/redis/redis-server | #执行文件位置 |
| config_file:/usr/local/redis/./redis.conf | #配置文件位置 |
Clients
| 参数 | 说明 |
|---|---|
| connected_clients:2 | #已连接的客户端数(不包括通过slave连接的客户端) |
| client_recent_max_input_buffer:2 | |
| client_recent_max_output_buffer:0 | |
| blocked_clients:0 | #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 |
Memory
| 参数 | 说明 |
|---|---|
| used_memory:8985032 | #由redis分配器分配的内存总量,以字节为单位 |
| used_memory_human:8.57M | #易读方式 |
| used_memory_rss:15175680 | #从操作系统的角度,返回redis已分配的内存总量(俗称常驻集大小) |
| used_memory_rss_human:14.47M | |
| used_memory_peak:14859000 | #redis的内存消耗峰值(以字节为单位) |
| used_memory_peak_human:14.17M | |
| used_memory_peak_perc:60.47% | #峰值内存超出分配内存(used_memory)的百分比 |
| used_memory_overhead:5407864 | #服务器为管理其内部数据结构而分配的所有开销的字节总和 |
| used_memory_startup:862032 | #Redis在启动时消耗的初始内存量(以字节为单位) |
| used_memory_dataset:3577168 | |
| used_memory_dataset_perc:44.04% | |
| allocator_allocated:8951208 | |
| allocator_active:15137792 | |
| allocator_resident:15137792 | |
| total_system_memory:512077824 | #系统内存总量 |
| total_system_memory_human:488.36M | |
| used_memory_lua:37888 | #Lua引擎使用的字节量 |
| used_memory_lua_human:37.00K | |
| used_memory_scripts:0 | |
| used_memory_scripts_human:0B | |
| number_of_cached_scripts:0 | |
| maxmemory:0 | #配置设置的最大可使用内存值 |
| maxmemory_human:0B | |
| maxmemory_policy:noeviction | |
| allocator_frag_ratio:1.69 | |
| allocator_frag_bytes:6186584 | |
| allocator_rss_ratio:1.00 | |
| allocator_rss_bytes:0 | |
| rss_overhead_ratio:1.00 | |
| rss_overhead_bytes:37888 | |
| mem_fragmentation_ratio:1.70 | #used_memory_rss和used_memory之间的比率 |
| mem_fragmentation_bytes:6224472 | #used_memory_rss和used_memory之间的差值,单位字节 |
| mem_not_counted_for_evict:0 | |
| mem_replication_backlog:0 | |
| mem_clients_slaves:0 | |
| mem_clients_normal:66616 | |
| mem_aof_buffer:0 | |
| mem_allocator:libc | #内存分配器,在编译时选择 |
| active_defrag_running:0 | #指示活动碎片整理是否处于活动状态的标志 |
| lazyfree_pending_objects:0 |
Persistence
| 参数 | 说明 |
|---|---|
| loading:0 | #服务器是否正在载入持久化rdb文件 |
| rdb_changes_since_last_save:0 | #自上次rdb持久化以来发生改变的数值 |
| rdb_bgsave_in_progress:0 | #服务器是否正在创建rdb文件 |
| rdb_last_save_time:1564845192 | #最后一次成功rdb持久化的时间戳 |
| rdb_last_bgsave_status:ok | #最后一次rdb持久化是否成功 |
| rdb_last_bgsave_time_sec:0 | #最后一次成功生成rdb文件耗时秒数 |
| rdb_current_bgsave_time_sec:-1 | #当前bgsave已耗费的时间(如果有) |
| rdb_last_cow_size:438272 | #上次rbd保存操作期间写时复制分配的字节大小 |
| aof_enabled:0 | #aof功能是否开启 |
| aof_rewrite_in_progress:0 | #标识aof的rewrite操作是否在进行中 |
| aof_rewrite_scheduled:0 | |
| aof_last_rewrite_time_sec:-1 | #最后一次aof rewrite耗费的时长 |
| aof_current_rewrite_time_sec:-1 | #当前rewrite已耗费的时间(如果有) |
| aof_last_bgrewrite_status:ok | #最后一次bgrewrite是否成功 |
| aof_last_write_status:ok | #上次aof写入状态 |
| aof_last_cow_size:0 | #上次AOF重写操作期间写时复制分配的大小(以字节为单位) |
如果激活了AOF,则会添加以下附加字段:
| aof_current_size:4201740 | #aof当前尺寸 |
| aof_base_size:4201687 | #服务器启动时或者aof重写最近一次执行之后aof文件的大小 |
| aof_pending_rewrite:0 | #是否有aof重写操作在等待rdb文件创建完毕之后执行? |
| aof_buffer_length:0 | #aof buffer的大小 |
| aof_rewrite_buffer_length:0 | #aof rewrite buffer的大小 |
| aof_pending_bio_fsync:0 | #后台I/O队列里面,等待执行的fsync调用数量 |
| aof_delayed_fsync:0 | #被延迟的fsync调用数量 |
如果正在进行加载操作,则会添加以下附加字段:
| loading_start_time | #加载操作开始的基于纪元的时间戳 |
| loading_total_bytes | #文件总大小 |
| loading_loaded_bytes | #已加载的字节数 |
| loading_loaded_perc | #加载进度表示为百分比 |
| loading_eta_seconds | #ETA在几秒钟内完成负载 |
Stats
| 参数 | 说明 |
|---|---|
| total_connections_received:7212 | #服务接受的总连接数 |
| total_commands_processed:2341631 | #服务器处理的总命令数 |
| instantaneous_ops_per_sec:0 | #每秒处理的命令数 |
| total_net_input_bytes:125344667 | #从网络读取的总字节数 |
| total_net_output_bytes:1712517025 | #写入网络的总字节数 |
| instantaneous_input_kbps:0.00 | #网络读取速率KB/sec |
| instantaneous_output_kbps:0.00 | #网络写入速率KB/sec |
| rejected_connections:0 | #因达到最大连接数而拒绝的连接 |
| sync_full:1 | #给从节点完全同步的数量 |
| sync_partial_ok:0 | #接受的同步请求数量 |
| sync_partial_err:0 | #拒绝的同步请求数量 |
| expired_keys:0 | #键到期的总数 |
| expired_stale_perc:0.00 | |
| expired_time_cap_reached_count:0 | |
| evicted_keys:0 | #因达到maxmemory限制而被驱逐的键的数量 |
| keyspace_hits:641037 | #Number of successful lookup of keys in the main dictionary |
| keyspace_misses:9002 | #Number of failed lookup of keys in the main dictionary |
| pubsub_channels:1 | |
| pubsub_patterns:0 | |
| latest_fork_usec:326 | #最新fork操作的持续时间(以微秒为单位) |
| migrate_cached_sockets:0 | |
| slave_expires_tracked_keys:0 | |
| active_defrag_hits:0 | |
| active_defrag_misses:0 | |
| active_defrag_key_hits:0 | |
| active_defrag_key_misses:0 |
Replication
| 参数 | 说明 |
|---|---|
| role:master | #master or slave |
| connected_slaves:0 | #已建立连接的从节点数 |
| master_replid:fe1bb6f5cfef91b36603d8e57081cc02890705c8 | #复制ID |
| master_replid2:0000000000000000000000000000000000000000 | #第二个复制ID,用于failover的PSYNC |
| master_repl_offset:86270959 | #服务当前的复制偏移量 |
| second_repl_offset:-1 | #The offset up to which replication IDs are accepted |
| repl_backlog_active:0 | |
| repl_backlog_size:1048576 | #复制积压缓冲区的总大小(B) |
| repl_backlog_first_byte_offset:85222384 | #复制积压缓冲区的主偏移量 |
| repl_backlog_histlen:1048576 | #复制积压缓冲区中数据的大小 |
CPU
| 参数 | 说明 |
|---|---|
| used_cpu_sys:24.941282 | #Redis服务消耗的系统cpu |
| used_cpu_user:18.820039 | #Redis服务消耗的用户cpu |
| used_cpu_sys_children:0.050757 | #后台进程占用的系统cpu |
| used_cpu_user_children:0.259980 | #后台进程占用的用户cpu |
Cluster 集群信息
cluster_enabled:0
Keyspace #数据库的统计信息
db0:keys=85766,expires=0,avg_ttl=0
参考
https://www.jianshu.com/p/a323877f80db
监控JAVA
JMX(Java Management Extensions,即Java管理扩展)是java平台上为应用程序、设备、系统等植入管理功能的框架。
监控原理
当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix-JavaGateway请求数据,而ZabbixJavagateway收到请求后使用"JMXmanagementAPI"去查询特定的应用程序,而前提是应用程序这端在开启时需要"-Dcom.sun.management.jmxremote"参数来开启JMX远程查询就行。Java程序会启动自身的一个简单的小程序端口12345向Zabbix-JavaGateway提供请求数据。
从上面的原理图中可以看出,配置Zabbix监控Java应用程序的关键点在于:配置Zabbix-JavaGateway、让Zabbix-Server能够连接Zabbix-JavaGateway、Tomcat开启JVM远程监控功能等。
JMX API
从 JVM 运行时获取GC行为数据, 最简单的办法是使用标准 JMX API 接口. JMX是获取 JVM内部运行时状态信息 的标准API. 可以编写程序代码, 通过 JMX API 来访问本程序所在的JVM,也可以通过JMX客户端执行(远程)访问。
最常见的 JMX客户端是 JConsole 和 JVisualVM (可以安装各种插件,十分强大)。两个工具都是标准JDK的一部分, 而且很容易使用. 如果使用的是 JDK 7u40 及更高版本, 还可以使用另一个工具: Java Mission Control( 大致翻译为 Java控制中心, jmc.exe)。
本文监控jvm内容如下:
- 内存使用状态:堆内存(Heap memory)和非堆内存(No Heap memory),包括已用值、最大值、已提交;
- 堆内存内存池:新生代(eden space),survivor space,老年代(old gen)的内存使用状态;
- 非堆内存内存池:代码缓存(Code cache),元空间(meta space),压缩类空间(compressed class space);
- 类加载:加载总数,已加载,已卸载。
- Java线程:总开启线程,活动线程,线程峰值。
本文监控tomcat内容如下:
- Tomcat请求数:包括每秒请求数,每秒出错数;
- Tomcat网络流量统计:包括进流量统计,出流量统计;
- Tomcat线程:包括最大线程数,当前线程数,当前繁忙线程数。
我没有在zabbix中添加垃圾回收(gc)的监控,而是在catalina配置里面添加gc日输入来给开发进行分析,设置方式如下:
CATALINA_OPTS=”-XX:ParallelGCThreads=4 -XX:+PrintGCDetails -Xloggc:日志存放路径”
配置JMX监控步骤:
1、安装Zabbix-Java-Gateway
2、配置zabbix_java_gateway.conf参数
3、配置zabbix_server.conf参数
4、Java应用开启JMX协议
5、Zabbix Web配置JMX监控的Java应用
监控环境搭建
Server端配置
1、Zabbix server端安装java jdk环境并开启javaGateway支持java监控。
javaGateway 启用方式如下:
- Zabbix通过rpm包安装:只需要安装zabbix-java-gateway包即可。
- Zabbix通过编译安装:在编译时需要加上—enable-java以支持jmx监控,如果之前没加需要重新编译。
2、安装 Zabbix-Java-Gateway
# 阿里 Zabbix yum 源
rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
# 安装 java 环境
yum install java
yum install zabbix-java-gateway
3、配置 zabbix_java_gateway.conf
修改配置如下:
[root@linux-node2 ~]# egrep -v '^#|^$' /etc/zabbix/zabbix_java_gateway.conf
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/var/run/zabbix/zabbix_java.pid"
START_POLLERS=5
TIMEOUT=3
4、配置 zabbix_server.conf
修改配置如下(关注 Java 相关参数):
[root@linux-node1 ~]# egrep -v '^#|^$' /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
JavaGateway=192.168.56.12
JavaGatewayPort=10052
StartJavaPollers=5
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
agent端配置
1、下载catalina-jmx-remote.jar包,到tomcat安装目录下的lib目录
wget -O /usr/local/tomcat/lib/catalina-jmx-remote.jar http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.23/bin/extras/catalina-jmx-remote.jar
2、修改catalina.sh添加如下内容,最后两行参数可以不配置
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=10053 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=true \
-Djava.rmi.server.hostname=192.168.56.12 \
- com.sun.management.jmxremote.access.file:/mnt/tomcatpolicyweb/conf/jmxremote.access\
- com.sun.management.jmxremote.password.file:/mnt/tomcatpolicyweb/conf/jmxremote.password"
- Djava.rmi.server.hostname: 主机ip
- Dcom.sun.management.jmxremote.port:server端获取数据的端口
- Dcom.sun.management.jmxremote.authenticate:是否使用密码,如果使用则需要配置账号密码文件
参考文档:https://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html
3、可以参考jdk提供的官方文档 /usr/local/java/jdk1.8/jre/lib/management
jmxremote.access 文件示例:
monitorRoleUser readonly
controlRoleUser readwrite \
create javax.management.monitor.*,javax.management.timer.* \
unregister
jmxremote.password 文件示例:
monitorRoleUser pass1
controlRoleUser pass2
修改权限
chmod 600 /mnt/tomcatpolicyweb/conf/jmxremote.access
chmod 600 /mnt/tomcatpolicyweb/conf/jmxremote.password
chown root:root /mnt/tomcatpolicyweb/conf/jmxremote.access
chown root:root /mnt/tomcatpolicyweb/conf/jmxremote.password
重启tomcat
测试
在 Zabbix Server上通过 cmdline-jmxclient 验证,下载地址http://crawler.archive.org/cm...
wget http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar
jar包用法:java -jar cmdline-jmxclient.jar USER:PASS HOST:PORT [BEAN] [COMMAND]
命令顺序:java -jar cmdline-jmxclient.jar java.lang:type=Threading,name Operations/Attributes
(2)本地执行如下命令查看tomcat的堆内存信息
[root@linux-node1 ~]# java -jar cmdline-jmxclient-0.10.3.jar - 192.168.56.12:10053 java.lang:type=Memory NonHeapMemoryUsage
06/20/2016 12:05:20 +0800 org.archive.jmx.Client NonHeapMemoryUsage:
committed: 30015488
init: 2555904
max: -1
used: 28761904
#如果有账号密码
java -jar cmdline-jmxclient-0.10.3.jar - monitorRoleUser:*qZ6nUlNcsg0w3Ut 172.21.21.85:10054 java.lang:type-Memory NonHeapMemoryUsage
参考文档:http://crawler.archive.org/cmdline-jmxclient/
本文监控jvm内容如下:
- 内存使用状态:堆内存(Heap memory)和非堆内存(No Heap memory),包括已用值、最大值、已提交;
- 堆内存内存池:新生代(eden space),survivor space,老年代(old gen)的内存使用状态;
非堆内存内存池:代码缓存(Code cache),元空间(meta space),压缩类空间(compressed class space);
类加载:加载总数,已加载,已卸载。
Java线程:总开启线程,活动线程,线程峰值。
垃圾收集器(PS MarkSweep)
本文监控tomcat内容如下:
- Tomcat请求数:包括每秒请求数,每秒出错数;
- Tomcat网络流量统计:包括进流量统计,出流量统计;
- Tomcat线程:包括最大线程数,当前线程数,当前繁忙线程数。
我没有在zabbix中添加垃圾回收(gc)的监控,而是在catalina配置里面添加gc日输入来给开发进行分析,设置方式如下。
CATALINA_OPTS=”-XX:ParallelGCThreads=4 -XX:+PrintGCDetails -Xloggc:日志存放路径”
监控数据采集
查看所有Mbean类型
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:10054
堆内存
Tomcat本地查看堆内存信息:
[root@tomcat-01 ~]# java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Memory HeapMemoryUsage
11/04/2016 15:36:58 +0800 org.archive.jmx.Client HeapMemoryUsage:
committed: 2145910784
init: 2147483648
max: 2145910784
used: 741540536
zabbix监控堆内存键值:
堆内存最大值:jmx["java.lang:type=Memory","HeapMemoryUsage.max"]
已用堆内存:jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
已提交堆内存:jmx["java.lang:type=Memory","HeapMemoryUsage.committed"]
一个完整的zabbix item填写方式如下,不同内容填写不同的键值即可:


创建图形的步骤本文就忽略了,添加图形步骤可以参考
低级别发现
jmx.discovery[beans,"*:type=GarbageCollector,name=*"] #检索所有的垃圾收集器
jmx.discovery[attributes,"*:type=GarbageCollector,name=*"] #检索所有垃圾收集器属性
jmx.discovery[beans] #检索所有 JMX MBeans
jmx.discovery #检索所有 JMX MBean 属性
https://www.zabbix.com/documentation/4.4/en/manual/discovery/low_level_discovery/jmx
更多配置请参考官网:
https://www.zabbix.com/documentation/4.4/en/manual/config/items/itemtypes/jmx_monitoring
Zabbix监控项键值
| 配置项 | 值 |
|---|---|
| Tomcat请求总数监控 | jmx["Catalina:type=GlobalRequestProcessor,name="http-nio-8080"",requestCount] |
| JVM老年代已使用内存监控 | jmx["java.lang:type=MemoryPool,name=Tenured Gen", "Usage.used"] |
| JVM老年代总内存监控 | jmx["java.lang:type=MemoryPool,name=Tenured Gen", "Usage.committed"] |
| eden区域最大空间 | jmx["java.lang:type=MemoryPool,name=PS Eden Space",Usage.max] |
| eden区域已用空间 | jmx["java.lang:type=MemoryPool,name=PS Eden Space",Usage.used] |
| eden区域提交空间 | jmx["java.lang:type=MemoryPool,name=PS Eden Space",Usage.committed] |
| Survivor 提交 | jmx["java.lang:type=MemoryPool,name=PS Survivor Space",Usage.committed] |
| Survivor 最大 | jmx["java.lang:type=MemoryPool,name=PS Survivor Space",Usage.max] |
| Survivor 已使用 | jmx["java.lang:type=MemoryPool,name=PS Survivor Space",Usage.used] |
| old gen 提交 | jmx["java.lang:type=MemoryPool,name=PS Old Gen",Usage.committed] |
| old gen 最大 | jmx["java.lang:type=MemoryPool,name=PS Old Gen",Usage.max] |
| old gen 已使用 | jmx["java.lang:type=MemoryPool,name=PS Old Gen",Usage.used] |
| 非堆内存提交 | jmx["java.lang:type=Memory","NonHeapMemoryUsag.committed"] |
| 非堆内存使用 | jmx["java.lang:type=Memory","NonHeapMemoryUsage.used"] |
| 堆内存使用值 | jmx["java.lang:type=Memory",HeapMemoryUsage.used] |
| mete space区域 | jmx["java.lang:type=MemoryPool,name=Metaspace",Usage.committed] |
| mete space区域 | jmx["java.lang:type=MemoryPool,name=Metaspace",Usage.used] |
| code cache区域使用 | jmx["java.lang:type=MemoryPool,name=Code Cache",Usage.used] |
| compressed class space区域使用 | jmx["java.lang:type=MemoryPool,name=Compressed Class Space",Usage.used] |
| 类加载信息 加载总数 | jmx["java.lang:type=ClassLoading","TotalLoadedClassCount"] |
| 类加载信息 已加载 | jmx["java.lang:type=ClassLoading","LoadedClassCount"] |
| 类加载信息 已卸载 | jmx["java.lang:type=ClassLoading","UnloadedClassCount"] |
| java线程 总开启线程 | jmx["java.lang:type=Threading","TotalStartedThreadCount"] |
| java活动线程数 | jmx["java.lang:type=Threading","ThreadCount"] |
| java线程峰值数 | jmx["java.lang:type=Threading","PeakThreadCount"] |
| tomcat最大线程 | jmx["Catalina:type=ThreadPool,name="http-nio-8080"",maxThreads] |
| tomcat当前线程 | jmx["Catalina:type=ThreadPool,name="http-nio-8080"",currentThreadCount] |
| tomcat繁忙线程 | jmx["Catalina:type=ThreadPool,name="http-nio-8080"",currentThreadsBusy] |
| 接收的字节 | jmx["Catalina:type=GlobalRequestProcessor,name="http-nio-8080"",bytesReceived] |
| 发送的字节 | jmx["Catalina:type=GlobalRequestProcessor,name="http-nio-8080"",bytesSent] |
| jmx正常工作时间 | jmx["java.lang:type=Runtime",Uptime] |
| 系统打开文件描述符数量 | jmx["java.lang:type=OperatingSystem",OpenFileDescriptorCount] |
| 操作系统最大文件描述符数量 | jmx["java.lang:type=OperatingSystem",MaxFileDescriptorCount] |
| gc新生内存每秒收集累计时间 | jmx["java.lang:type=GarbageCollector,name=PS Scavenge",CollectionTime] |
| gc新生内存每秒收集数 | jmx["java.lang:type=GarbageCollector,name=PS Scavenge",CollectionCount] |
| gc持久内存每秒收集累计时间 | jmx["java.lang:type=GarbageCollector,name=PS MarkSweep",CollectionTime] |
| gc持久内存每秒收集数 | jmx["java.lang:type=GarbageCollector,name=PS MarkSweep",CollectionCount] |
JVM区域总体分两类,heap区和非heap区。
heap区又分为:
Eden Space(伊甸园):
Eden Space字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能被回收的对象被放入到空的survivor区域。
Survivor Space幸存者区
用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象。Survivor有两个,分别为To Survivor、 From Survivor,这个两个区域的空间大小是一样的。执行垃圾回收的时候Eden区域不能被回收的对象被放入到空的survivor(也就是To Survivor,同时Eden区域的内存会在垃圾回收的过程中全部释放),另一个survivor(即From Survivor)里不能被回收的对象也会被放入这个survivor(即To Survivor),然后To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的。
Old Gen(老年代)
用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能是新生代分配不了内存的大对象会直接进入老年代。经过多次垃圾回收都没有被回收的对象,这些对象的年代已经足够old了,就会放入到老年代。
非heap区又分:
Code Cache(代码缓存区);
代码缓存区,它主要用于存放JIT所编译的代码。CodeCache代码缓冲区的大小在client模式下默认最大是32m,在server模式下默认是48m,这个值也是可以设置的,它所对应的JVM参数为ReservedCodeCacheSize 和 InitialCodeCacheSize
Perm Gen(永久代);
Perm Gen全称是Permanent Generation space,是指内存的永久保存区域,因而称之为永久代。这个内存区域用于存放Class和Meta的信息,Class在被 Load的时候被放入这个区域。因为Perm里存储的东西永远不会被JVM垃圾回收的,所以如果你的应用程序LOAD很多CLASS的话,就很可能出现PermGen space错误。默认大小为物理内存的1/64。
Jvm Stack(java虚拟机栈);
Local Method Statck(本地方法栈);
Tomcat 本地查看code cache区域使用:
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=Code\ Cache Usage
Tomcat 内存池compressed class space*
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=Compressed\ Class\ Space Usage
Tomcat本地查看类加载信息:
加载总数: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading TotalLoadedClassCoun
已加载: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading LoadedClassCount
已卸载: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading UnloadedClassCount
tomcat本地查看java线程:
总开启线程: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Threading TotalStartedThreadCount
活动线程: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Threading PeakThreadCount
线程峰值: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Threading PeakThreadCount
Tomcat线程
本地查看tomcat线程信息:
最大线程:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=ThreadPool maxThreads
当前线程:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=ThreadPool currentThreadCount
繁忙线程:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=ThreadPool currentThreadsBusy
网络流量
Tomcat本地查看接收的字节:
接收的字节:
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor bytesReceived
发送的字节:
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor bytesSent
tomcat请求,出错请求
#查看tomcat请求数:
java -jar cmdline-jmxclient-0.10.3.jar - 192.168.10.46:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor requestCount
#tomcat出错请求:
java -jar cmdline-jmxclient-0.10.3.jar - 192.168.10.46:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor errorCount
GC信息
java -jar cmdline-jmxclient-0.10.3.jar - 172.21.21.85:10054 java.lang:type=GarbageCollector,name=*
内存池eden space
Tomcat本地查看eden space:
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=PS\ Eden\ Space Usage
内存池survivor space
Tomcat本地查看Survivor space区域:
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=PS\ Survivor\ Space Usage
内存池old gen
Tomcat本地查看old gen区域使用:
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:name=PS\ Old\ Gen,type=MemoryPool Usage
非堆内存
Tomcat 本地查看非堆内存使用:
java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Memory NonHeapMemoryUsag1
内存池meta space
Tomcat 本地查看meta space区域使用:
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=Metaspace Usage
踩坑
获取不到数据,报错如下:
# java -jar /root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9080 java.lang:type=MemoryPool,name=PS\ Eden\ Space Usag
11/11/2016 10:03:37 +0800
org.archive.jmx.Client java.lang:name=PS Eden Space,type=MemoryPool is not a registered bean
解决思路
- 如果你使用命令行监控获取不到数据,那么就先使用jconsole看看有没有数据,
- 如果jconsole有数据,那么就往下看,反之检查你的环境。
- 如果jconsole有数据,但是命令行没有数据,那么就是Mbean的Object Name或者属性有问题
参考
使用 zabbix 监控 tomcat(包含jvm监控)
选项 2:在不使用 SSL 的情况下设置 JMX 以进行客户机认证
https://jaminzhang.github.io/monitoring/Zabbix-config-JMX/ Zabbix 配置 JMX 监控
https://zabbix-manual-in-chinese.readthedocs.io/en/latest/concepts/java/ 5 Java gateway
https://zhuanlan.zhihu.com/p/26214242 jmx监控之Generic