java - 使用 ~100% CPU 和 250 TPS 测试的 Web 应用程序

标签 java multithreading performance tomcat optimization

我有一个简单的休息服务,它从 Mysql 数据库获取数据。我正在使用汤姆猫。当我运行 250 TPS 测试时,CPU 使用率上升到 ~85%。我查看了哪个 Java 线程消耗了更多内存,并基于此查看了线程转储中的线程,但不知道发生了什么。

我有2个核心cpu,tomcat线程池200个线程。

    Tasks: 202 total,   2 running, 200 sleeping,   0 stopped,   0 zombie
    Cpu(s):  5.0%us,  2.2%sy,  0.0%ni, 92.5%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   7539820k total,  7409136k used,   130684k free,    74432k buffers
    Swap:        0k total,        0k used,        0k free,  5031940k cached

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                       
    24589 root      20   0 5551m 1.8g  16m S  3.9 25.0   0:06.33 java                                                                           
    24998 root      20   0 5551m 1.8g  16m S  3.9 25.0   0:00.75 java                                                                           
    25043 root      20   0 5551m 1.8g  16m S  3.9 25.0   0:00.74 java                                                                           
    25051 root      20   0 5551m 1.8g  16m S  3.9 25.0   0:00.73 java                                                                           
    18407 root      20   0 5551m 1.8g  16m S  2.0 25.0   1:02.71 java                                                                           
    19413 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:50.43 java                                                                           
    24385 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:17.01 java                                                                           
    24386 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:16.84 java                                                                           
    24441 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:12.61 java                                                                           
    24443 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:12.51 java                                                                           
    24540 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.33 java                                                                           
    24543 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.37 java                                                                           
    24552 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.26 java                                                                           
    24554 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.21 java                                                                           
    24555 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.37 java                                                                           
    24556 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.31 java                                                                           
    24558 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.20 java                                                                           
    24560 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.27 java                                                                           
    24562 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.28 java                                                                           
    24563 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.32 java                                                                           
    24564 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.30 java                                                                           
    24566 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.33 java                                                                           
    24568 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.20 java                                                                           
    24569 root      20   0 5551m 1.8g  16m R  2.0 25.0   0:06.21 java                                                                           
    24573 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.24 java                                                                           
    24575 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.24 java                                                                           
    24577 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.25 java                                                                           
    24580 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.36 java                                                                           
    24581 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.29 java                                                                           
    24583 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.32 java                                                                           
    24585 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.25 java                                                                           
    24591 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.32 java                                                                           
    24592 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.31 java                                                                           
    24595 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.30 java                                                                           
    24600 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.33 java                                                                           
    24604 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.33 java                                                                           
    24605 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.36 java                                                                           
    24610 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.41 java                                                                           
    24616 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.28 java                                                                           
    24618 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.37 java                                                                           
    24620 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.25 java                                                                           
    24623 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.20 java                                                                           
    24624 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:06.33 java                                                                           
    24999 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.71 java                                                                           
    25000 root      20   0 5551m 1.8g  16m R  2.0 25.0   0:00.70 java                                                                           
    25001 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.76 java                                                                           
    25006 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.74 java                                                                           
    25007 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.73 java                                                                           
    25013 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.74 java                                                                           
    25017 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.76 java                                                                           
    25029 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.69 java                                                                           
    25038 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.73 java                                                                           
    25039 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.74 java                                                                           
    25046 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.74 java                                                                           
    25047 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.69 java                                                                           
    25050 root      20   0 5551m 1.8g  16m S  2.0 25.0   0:00.73 java                                                                           
    12594 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:00.00 java                                                                           
    12595 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:19.58 java                                                                           
    12596 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:08.76 java                                                                           
    12597 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:08.83 java                                                                           
    12598 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:14.77 java                                                                           
    12599 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:00.18 java                                                                           
    12600 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:00.16 java                                                                           
    12601 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:00.00 java                                                                           
    12604 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:00.00 java                                                                           
    12605 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:00.01 java                                                                           
    12606 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:00.00 java                                                                           
    12607 root      20   0 5551m 1.8g  16m S  0.0 25.0   0:01.02 java  

线程转储:

"http-apr-8443-exec-363" #397 daemon prio=5 os_prio=0 tid=0x00007f97cc2d0000 nid=0x600f waiting on condition [0x00007f978cbd2000]
       java.lang.Thread.State: TIMED_WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x0000000722096050> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
            at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:31)
            at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            at java.lang.Thread.run(Thread.java:745)

    "http-apr-8443-exec-362" #396 daemon prio=5 os_prio=0 tid=0x00007f97cc1b2000 nid=0x600e waiting on condition [0x00007f978cdd4000]
       java.lang.Thread.State: TIMED_WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x0000000722096050> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
            at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:31)
            at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            at java.lang.Thread.run(Thread.java:745Connection to 52.32.230.38 closed by remote host.
    Connection to 52.32.230.38 closed.
    qadeersmsiphone:/ pdubey$ 395 daemon prio=5 os_prio=0 tid=0x00007f97cc254800 nid=0x600d waiting on condition [0x00007f978d5dc000]
       java.lang.Thread.State: TIMED_WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x0000000722096050> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
            at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:31)
            at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            at java.lang.Thread.run(Thread.java:745)

    "http-apr-8443-exec-360" #394 daemon prio=5 os_prio=0 tid=0x00007f97cc063000 nid=0x600c waiting on condition [0x00007f978d6dd000]
       java.lang.Thread.State: TIMED_WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x0000000722096050> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
            at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:31)
            at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            at java.lang.Thread.run(Thread.java:745)

    "http-apr-8443-exec-359" #393 daemon prio=5 os_prio=0 tid=0x00007f97cc072000 nid=0x600b waiting on condition [0x00007f978d8df000]
       java.lang.Thread.State: TIMED_WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x0000000722096050> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
            at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
            at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
                                                                                                                              1794,41-48    55%

顶级线程进程(PID 24589):

 http-apr-8443-exec-361" #395 daemon prio=5 os_prio=0 tid=0x00007f97cc254800 nid=0x600d waiting on condition [0x00007f978d5dc000]
        java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x0000000722096050> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
        at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
        at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:31)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

什么会导致如此高的 CPU 使用率。通常,当负载较小时,Web 服务响应约为 30 毫秒。

最佳答案

很可能您的 200 个线程竞争 2 个处理器核心导致上下文切换,这会占用大部分时间并提高处理器使用率。降低池大小并再次测试。

关于java - 使用 ~100% CPU 和 250 TPS 测试的 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33552690/

相关文章:

java - 使用数据库更改缓存更新

javascript - js中信息检索哪个更快?对象与计算

php - 如何提高mysql数据库插入的性能

java - JPA : Inheritance - Discriminator value not taken into account in generated SQL

java - 如何从 JAVA 字符串(文件路径)发送到 C?

vb.net - 在 Visual Basic (VS 2012 V11) 中进行跨线程时正确更新文本框

c++ - boost 多线程和共享变量

java - 如何使用 Java Google Drive API 上传文件

Java 8 toMap 用于映射 <string, Collection<String>>

java - 如何获得数字的整数部分和余数?