如何基于端口监控FreeSWITCH的Recv-Q?
# 连接FS服务器,执行recvq接收队列监控脚本
while true; do
/bin/bash -x recvq_monitor.sh
sleep 3
done
# 复制新开上一个连接FS服务器的窗口,执行模拟阻塞脚本,大批量发送数据给FS服务器的指定端口,执行后回到上一窗口观察输出
/bin/bash -x simulate_recvq.sh
recvq_monitor.sh
#!/bin/bash
# 此脚本为 recvq_monitor.sh
# 定义需要监控的端口数组
MONITOR_PORTS=(8021 3306)
# 获取当前时间戳
timestamp=$(date +"%F %T")
echo "[$timestamp] 开始端口Recv-Q监控..."
# 遍历数组
for port in "${MONITOR_PORTS[@]}"; do
# 使用ss获取监听端口的连接信息
ss -tnp | grep ":$port " | while read -r line; do
# 提取Recv-Q, PID, 状态等字段
recv_q=$(echo "$line" | awk '{print $2}')
pid_info=$(echo "$line" | awk -F 'pid=' '{print $2}' | cut -d',' -f1)
# 提取本地端口
local_port=$(echo "$line" | awk '{print $4}' | awk -F':' '{print $NF}')
# 判断Recv-Q是否大于0
if [ "$recv_q" -gt 0 ]; then
echo "[异常] PID: $pid_info, 端口: $local_port, Recv-Q: $recv_q"
fi
done
done
simulate_recvq.sh
#!/bin/bash
# 此脚本为 simulate_recvq.sh
# 目标 IP 和端口
HOST=127.0.0.1
PORT=8021
# 无限while循环写入数据,模拟堆积
(
echo "AUTH ClueCon"
sleep 1
while true; do
# 发送随机垃圾数据,每次1000KB
head -c 1024000 /dev/urandom | base64
sleep 0.05
done
) | nc $HOST $PORT
# nc发送tcp长连接