在负载下测试我的 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 时间(假设为 5 毫秒)。然后它通过 JDBC 连接到数据库,发送一些 sql 查询并等待响应,比如说 10ms。这10ms显然算作/usr/sbin/mysqld
CPU使用率。然后 java
线程恢复其操作并完成,又消耗了 20 毫秒,总计执行时间为 5+10+20=30 毫秒。
新手问题是:你不认为这些与数据库相关的 10ms 被计算了两次:一次是 java 线程等待数据库处理查询,第二次是数据库 CPU 使用率本身?我在这里有什么不明白?
最佳答案
当一个进程只是在等待一个套接字时,它通常不会使用大量的 CPU。基本上,内核知道它处于等待状态并且不会安排它运行 - 除了信号处理之类的小事情,可以使用例如定期运行垃圾收集器。
(好吧,如果有很多垃圾要收集,那“小东西”可能就不会那么少了。)
关于java - Java+JDBC的CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5626468/