在负载下测试我的webapp时,我在Linux下获得了top
摘录:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3964 nobody 20 0 4965m 622m 6048 S 8.5 11.0 6:02.49 java
1985 mysql 20 0 294m 125m 3804 S 2.1 2.2 0:05.39 /usr/sbin/mysqld
我需要对java的%CPU
列进行解释。据我所知,在Web请求期间,java
的一个线程正在执行一些纯Java逻辑,消耗一些CPU时间(让它为5ms)。然后它通过JDBC连接到数据库,发送一些sql查询并等待,例如 10ms ,以进行响应。这些 10ms 显然被计为/usr/sbin/mysqld
CPU使用率。然后java
线程恢复它的操作并完成,耗费另外20ms,总计执行时间为5 + 10 + 20 = 30ms。
新手问题是:你不认为这些与db相关的 10ms 被计算两次:一次是java线程等待db处理查询而第二次作为数据库CPU使用本身?我在这里不明白什么?
答案 0 :(得分:4)
当进程只是在套接字上等待时,通常不会使用大量的CPU。基本上,内核知道它处于等待状态并且不会安排它运行 - 除了信号处理这样的小事情,例如可以使用它。定期运行垃圾收集器。
(好吧,如果要收集大量垃圾,那么“小东西”可能不会那么少。)