异常问题:load average值不正常
排查思路:
1.找到是哪个进程引起的异常,看看是否有cpu占用过高或者mem占用过高的进程
再根据具体情况分析原因。
定位到异常进程后,首先打堆栈,留存现场日志,然后停止进程,防止异常继续扩大,最后再分析原因。
停止进程首权优雅停止:server stop
若因cpu占用过高或mem占用过高无法执行,可使用kill命令杀死进程。
正常启停,可用jstack打堆栈,注意堆栈不要只打一个,多打几个,避免偶然情况。
若打堆栈命令也无法正常执行,则使用kill -6打包。
2.当 top
显示系统的 load average
很高,但没有明显的 CPU 或内存占用高的进程时,可能是由于以下原因之一:
-
I/O 等待:系统可能正在等待磁盘 I/O 操作完成。
-
排查方法:使用
iostat
或iotop
检查磁盘 I/O 情况。关注%util
列,表示设备的利用率。如果接近 100%,说明磁盘 I/O 是瓶颈。
-
-
锁争用:进程可能正在等待锁(如文件锁、数据库锁等)。
-
使用
strace
或perf
检查进程是否在等待锁。 -
strace -p <PID> :查看进程是否卡在 futex 或 flock 等系统调用上。
-
perf top : 查看哪些函数或系统调用占用最多时间。
-
-
僵尸进程:僵尸进程可能会增加负载,但不会占用 CPU 或内存。
-
排查方法:关注top命令返回的僵尸进程数
-
-
上下文切换:频繁的上下文切换可能导致高负载。
-
使用
vmstat
或pidstat
检查上下文切换情况 -
vmstat 1 :关注 cs列,表示上下文切换次数。如果很高,说明系统频繁切换进程。
-
pidstat -w 1:查看每个进程的上下文切换情况。
-
-
网络延迟:网络 I/O 操作可能导致高负载。
-
netstat -tnp:查看是否有大量连接处于 TIME_WAIT 或 CLOSE_WAIT 状态。
-
从开发角度直观分析,排除cpu和内存的影响后,优先考虑两点:
1,io瓶颈,包括网络io或者磁盘文件io(iostat可以观察下io情况)
2,线程数太多导致频繁的上下文切换,吞吐量太大(网络连接socket太多也属于线程数太多)
在 Linux 系统中,kill
命令用于向进程发送信号。信号是一种进程间通信机制,用于通知进程发生了某种事件。kill -6
发送的信号是 SIGABRT(Abort Signal)。
1. SIGABRT 信号的作用
-
SIGABRT 是进程中止信号,通常由程序自身调用
abort()
函数触发。 -
当进程接收到 SIGABRT 信号时,会立即终止,并生成一个核心转储文件(core dump),用于调试。
2. 使用 kill -6
-
向指定进程发送 SIGABRT 信号:
kill -6 <PID>
或
kill -SIGABRT <PID>
-
<PID>
是目标进程的进程 ID。
-
-
示例:
假设进程 ID 为1234
,发送 SIGABRT 信号:kill -6 1234
3. SIGABRT 的典型场景
-
程序内部错误:
-
当程序检测到严重错误(如内存损坏、断言失败)时,会调用
abort()
函数,触发 SIGABRT 信号。
-
-
调试:
-
开发者可以通过捕获 SIGABRT 信号生成核心转储文件,分析程序崩溃的原因。
-
4. SIGABRT 的处理
-
默认情况下,SIGABRT 信号会终止进程。
-
程序可以通过
signal()
或sigaction()
函数捕获 SIGABRT 信号,执行自定义操作。
5. SIGABRT 与核心转储
-
当进程因 SIGABRT 信号终止时,可能会生成核心转储文件(core dump)。
-
核心转储文件包含进程崩溃时的内存状态,可用于调试。
启用核心转储:
ulimit -c unlimited # 允许生成核心转储文件
查看核心转储文件:
-
核心转储文件通常命名为
core
或core.<PID>
。 -
使用
gdb
调试核心转储文件:gdb <executable> core
6. 其他常用信号
信号编号 | 信号名 | 描述 |
---|---|---|
1 | SIGHUP | 挂起信号 |
2 | SIGINT | 中断信号(Ctrl+C) |
3 | SIGQUIT | 退出信号(Ctrl+\) |
6 | SIGABRT | 中止信号 |
9 | SIGKILL | 强制终止信号 |
15 | SIGTERM | 终止信号(默认 kill ) |
7. 总结
-
kill -6
发送 SIGABRT 信号,用于中止进程。 -
SIGABRT 通常由程序内部调用
abort()
触发,生成核心转储文件。 -
可以通过捕获 SIGABRT 信号执行自定义操作。