1 出入网流量统计与内存使用统计脚本明细
1.1 出入网流量统计
redis-cli -h 172.21.204.201 client list | awk ' { # 初始化变量 ip = ""; omem = 0; # 出网:Redis→客户端的输出缓冲区(字节) argv_mem = 0; # 入网1:客户端命令参数内存(字节) qbuf = 0; # 入网2:客户端输入缓冲区(字节) # 解析每行字段(key=value 格式) for (i = 1; i <= NF; i++) { split($i, kv, "="); # 分割键值对 key = kv[1]; value = kv[2]; # 提取客户端IP(去掉端口,如 172.21.204.200:46102 → 172.21.204.200) if (key == "addr") { split(value, addr_parts, ":"); ip = addr_parts[1]; } # 提取出网相关字段(转为数值) else if (key == "omem") { omem = value + 0; } # 提取入网相关字段(转为数值) else if (key == "argv-mem") { argv_mem = value + 0; } else if (key == "qbuf") { qbuf = value + 0; } } # 按IP分组累加(跳过空IP) if (ip != "") { conn_count[ip]++; # 统计连接数 in_traffic[ip] += (argv_mem + qbuf);# 累计入网流量(字节)= 命令参数+输入缓冲区 out_traffic[ip] += omem; # 累计出网流量(字节)= 输出缓冲区 } } # 统计完成后输出(直接手动转换单位:字节→MB,避免函数) END { # 打印表头(左对齐,确保格式整齐) printf "%-20s %-8s %-25s %-25s\n", "客户端IP", "连接数", "入网流量(MB)", "出网流量(MB)"; printf "%-20s %-8s %-25s %-25s\n", "--------", "--------", "------------", "------------"; # 遍历所有客户端IP,计算并输出结果(1MB = 1024*1024 字节) for (ip in conn_count) { in_mb = in_traffic[ip] / (1024 * 1024); # 入网流量转MB out_mb = out_traffic[ip] / (1024 * 1024);# 出网流量转MB printf "%-20s %-8d %.6f %.2f\n", ip, conn_count[ip], in_mb, out_mb; } } '
输出:
客户端IP 连接数 入网流量(MB) 出网流量(MB) -------- -------- ------------ ------------ 172.21.204.200 8 21.448511 0.00 172.21.204.201 1 0.000034 0.00
1.2 内存使用统计
redis-cli client list | awk ' # 1. 解析 client list 输出,提取 IP、omem、tot-mem、argv-mem { # 初始化变量 ip = ""; omem = 0; tot_mem = 0; argv_mem = 0; # 遍历每个字段(格式:key=value) for (i=1; i<=NF; i++) { split($i, kv, "="); # 分割 key 和 value(如 "addr=172.21.204.200:46102" → kv[1]="addr", kv[2]="172.21.204.200:46102") if (kv[1] == "addr") { split(kv[2], addr, ":"); # 提取 IP(去掉端口,如 "172.21.204.200:46102" → addr[1]="172.21.204.200") ip = addr[1]; } else if (kv[1] == "omem") { omem = kv[2]; } else if (kv[1] == "tot-mem") { tot_mem = kv[2]; } else if (kv[1] == "argv-mem") { argv_mem = kv[2]; } } # 按 IP 分组累加(存储为字节) sum_omem[ip] += omem; sum_tot_mem[ip] += tot_mem; sum_argv_mem[ip] += argv_mem; # 统计每个 IP 的连接数 conn_count[ip]++; } # 2. 处理完所有行后,格式化输出结果 END { # 打印表头(左对齐,占20字符) printf "%-20s %-8s %-20s %-20s %-20s\n", "客户端IP", "连接数", "omem总和(MB)", "tot-mem总和(MB)", "argv-mem总和(MB)"; printf "%-20s %-8s %-20s %-20s %-20s\n", "--------", "--------", "------------", "--------------", "--------------"; # 遍历所有 IP,输出统计结果(字节转 MB:除以 1024*1024,保留2位小数) for (ip in sum_omem) { omem_mb = sum_omem[ip] / (1024*1024); tot_mem_mb = sum_tot_mem[ip] / (1024*1024); argv_mem_mb = sum_argv_mem[ip] / (1024*1024); printf "%-20s %-8d %.2f %.2f %.6f\n", ip, conn_count[ip], omem_mb, tot_mem_mb, argv_mem_mb; } } '
客户端IP 连接数 omem总和(MB) tot-mem总和(MB) argv-mem总和(MB) -------- -------- ------------ -------------- -------------- 172.21.204.200 10 108.00 108.20 0.000000 127.0.0.1 1 0.00 0.06 0.000010
1.3 两个脚本合一
#!/bin/bash # Redis客户端全量指标单行统计脚本 # 功能:一次性统计客户端IP、连接数、内存指标(omem/tot-mem/argv-mem)、流量指标(入网/出网),并单行展示 redis-cli -h 172.21.204.201 client list | awk ' { # 初始化所有待解析的变量(避免空值影响计算) ip = ""; omem = 0; # 内存指标:Redis→客户端的输出缓冲区(字节) tot_mem = 0; # 内存指标:客户端总内存占用(字节) argv_mem = 0;# 内存指标:客户端命令参数占用内存(字节) qbuf = 0; # 流量指标:客户端→Redis的输入缓冲区(字节) # 解析client list输出的key=value格式字段(逐字段处理) for (i = 1; i <= NF; i++) { split($i, kv, "="); # 分割键值对(例:"addr=172.21.204.200:46102" → kv[1]="addr", kv[2]="172.21.204.200:46102") key = kv[1]; value = kv[2]; # 提取客户端IP(去除端口号,仅保留IP地址,避免同一IP不同端口重复统计) if (key == "addr") { split(value, addr_parts, ":"); ip = addr_parts[1]; } # 提取内存相关字段(转为数值类型,防止字符串累加导致计算错误) else if (key == "omem") omem = value + 0; else if (key == "tot-mem") tot_mem = value + 0; else if (key == "argv-mem") argv_mem = value + 0; # 提取流量相关字段(输入缓冲区,用于计算入网总流量) else if (key == "qbuf") qbuf = value + 0; } # 按IP分组累加指标(跳过空IP,避免无效数据干扰统计结果) if (ip != "") { conn_count[ip]++; # 统计每个IP的客户端连接数 sum_omem[ip] += omem; # 累加输出缓冲区内存(omem) sum_tot_mem[ip] += tot_mem; # 累加客户端总内存(tot-mem) sum_argv_mem[ip] += argv_mem; # 累加命令参数内存(argv-mem) in_traffic[ip] += (argv_mem + qbuf);# 计算入网流量:命令参数内存 + 输入缓冲区(字节) out_traffic[ip] += omem; # 计算出网流量:输出缓冲区(omem,字节) } } # 最终输出逻辑:所有指标合并为一行展示,保持格式对齐 END { # 表头配置(左对齐,固定字段宽度,确保多IP场景下列对齐) printf "%-20s %-8s %-18s %-18s %-18s %-22s %-22s\n", "客户端IP", "连接数", "omem总和(MB)", "tot-mem总和(MB)", "argv-mem总和(MB)", "入网流量(MB)", "出网流量(MB)"; # 表头分隔线(与表头字段宽度一一对应,提升可读性) printf "%-20s %-8s %-18s %-18s %-18s %-22s %-22s\n", "--------", "--------", "------------", "--------------", "--------------", "------------", "------------"; # 遍历所有客户端IP,输出单行全量指标(保持与表头格式一致) for (ip in conn_count) { # 单位转换:字节 → MB(保留原统计精度,确保数据一致性) omem_mb = sum_omem[ip] / (1024 * 1024); # omem:保留2位小数 tot_mem_mb = sum_tot_mem[ip] / (1024 * 1024); # tot-mem:保留2位小数 argv_mem_mb = sum_argv_mem[ip] / (1024 * 1024);# argv-mem:保留6位小数(适配小数值场景) in_mb = in_traffic[ip] / (1024 * 1024); # 入网流量:保留6位小数 out_mb = out_traffic[ip] / (1024 * 1024); # 出网流量:保留2位小数 # 数据行输出(格式与表头严格匹配,确保列对齐) printf "%-20s %-8d %.2f %.2f %.6f %.6f %.2f\n", ip, conn_count[ip], omem_mb, tot_mem_mb, argv_mem_mb, in_mb, out_mb; } } '
客户端IP 连接数 omem总和(MB) tot-mem总和(MB) argv-mem总和(MB) 入网流量(MB) 出网流量(MB) -------- -------- ------------ -------------- -------------- ------------ ------------ 172.21.204.200 8 0.00 92.16 0.000113 25.296741 0.00 172.21.204.201 1 0.00 0.06 0.000010 0.000034 0.00
posted on
浙公网安备 33010602011771号