以 socket 模拟一个 API接口为例

1. 单线程下(BIO)

模拟进行30次每次40个并发 sb -u http://localhost:8801 -c 40 -N 30
并发请求/s = RPS: 47.1 (requests/second)
image.png

2. 多线程下

模拟进行30次每次40个并发 sb -u http://localhost:8802 -c 40 -N 30
并发请求/s = RPS: 736.6 (requests/second)
image.png

3. 使用线程池(节省线程疯狂创建关闭的开销)

模拟进行30次每次40个并发 sb -u http://localhost:8803 -c 40 -N 30
并发请求/s = RPS: 1047.3 (requests/second)
image.png

说一说

  • 从 1~3 的 吞吐量看出 性能有明显的提升!
  • 2~3 都是用线程,为什么差距那么大
    • 因为java中 创建线程会去操作系统中去创建一个真实的线程,用完在去关闭,当客户端调用2的时候,会创建特别特别多的线程,导致线程使用效率变低
      • image.png
    • 线程池中会有等待工作的线程,当请求进来直接就开始工作!线程的创建与销毁与当前服务无关,有线程池进行管理
      • image.png