先确认目标进程是否为数据库服务进程,执行ps -ef | grep -e "(postgres|mysql|kingbase|pg_ctl)"检查主进程是否存在;若输出含/usr/lib/postgresql/14/bin/postgres -d ...等行,则 postgresql 正在运行且 pid 可见。

确认目标进程是否为数据库服务进程
先判断你要监控的进程本身是不是数据库服务(如 postgresql、mysql、kingbase),因为只有这类进程才直接处理并发请求;若目标是普通应用(如 Java Web 服务),它对数据库的请求属于网络层调用,需从客户端侧切入监控。
执行 ps -ef | grep -E "(postgres|mysql|kingbase|pg_ctl)" 查看数据库主进程是否存在。若输出中包含类似 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main 的行,则确认 PostgreSQL 正在运行且 PID 可见。
使用系统监视器定位该进程的网络IO行为
打开“开始菜单”→搜索“系统监视器”→回车启动。
切换到“进程”选项卡,点击列标题“网络I/O”两次,使数值从升序变为降序——顶部进程即当前网络发送(TX)或接收(RX)最活跃者。
若目标数据库进程(如 postgres)未排在前列,说明它当前未处于高并发请求状态;若其 TX 值持续高于 50 KiB/s 且波动频繁,表明正被大量客户端连接驱动。
【注意:此处显示的是进程级网络吞吐量,不是SQL请求数。单次大查询可能产生高TX,但并发连接数未必多】
通过终端命令查看数据库进程的活跃连接数
第一步:获取数据库主进程的 PID,例如执行 pgrep -f "postgres.*-D" 得到主进程号(如 1248)。
第二步:检查该进程打开了多少 TCP 连接,执行 sudo ss -tnp | grep ":5432" | grep -c "pid=1248"(PostgreSQL 默认端口 5432);若返回数字 ≥10,表示已有至少 10 个并发客户端连接。
第三步:若需区分本地 vs 远程连接,将上条命令中的 grep ":5432" 替换为 grep ":5432.*ESTAB",再加 awk '{print }' | cut -d: -f1 | sort | uniq -c | sort -nr,可列出各客户端IP的连接数量。
针对 PostgreSQL 的深度并发请求监控
方法一:使用 psql 连入数据库后执行实时查询
执行 sudo -u postgres psql -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'active';",返回值即当前正在执行 SQL 的会话数。
方法二:查看全部连接状态分布
执行 sudo -u postgres psql -c "SELECT state, count(*) FROM pg_stat_activity GROUP BY state;",重点关注 active(正在执行)、idle in transaction(事务空闲,易引发锁等待)、idle(正常空闲)三类状态的数量比例。
【必须确保 postgres 用户有权限执行 pg_stat_activity 视图查询,否则需先执行 sudo -u postgres psql -c "GRANT SELECT ON pg_stat_activity TO your_user;"】
捕获某应用进程发起的数据库连接源头
若目标不是数据库服务自身,而是某个业务程序(如 /opt/myapp/bin/start.sh)在频繁连库,需反向追踪其建立的 socket 连接。
执行 sudo lsof -i :5432 -a -p $(pgrep -f "myapp"),该命令会列出该应用进程所有指向 5432 端口的网络连接,每行末尾的 -> xxx.xxx.xxx.xxx:5432 即数据库服务器地址。
若输出为空,说明该进程当前未建立任何数据库连接;若返回多行且远程端口固定为 5432,则证实它确实在持续发起请求。
这一步操作起来很简单,直接把命令复制进终端回车就行。











