以 socket 模拟一个 API接口为例
1. 单线程下(BIO)
模拟进行30次每次40个并发 sb -u http://localhost:8801 -c 40 -N 30
并发请求/s = RPS: 47.1 (requests/second)
2. 多线程下
模拟进行30次每次40个并发 sb -u http://localhost:8802 -c 40 -N 30
并发请求/s = RPS: 736.6 (requests/second)
3. 使用线程池(节省线程疯狂创建关闭的开销)
模拟进行30次每次40个并发 sb -u http://localhost:8803 -c 40 -N 30
并发请求/s = RPS: 1047.3 (requests/second)
说一说
- 从 1~3 的 吞吐量看出 性能有明显的提升!
- 2~3 都是用线程,为什么差距那么大
- 因为java中 创建线程会去操作系统中去创建一个真实的线程,用完在去关闭,当客户端调用2的时候,会创建特别特别多的线程,导致线程使用效率变低
- 线程池中会有等待工作的线程,当请求进来直接就开始工作!线程的创建与销毁与当前服务无关,有线程池进行管理
- 因为java中 创建线程会去操作系统中去创建一个真实的线程,用完在去关闭,当客户端调用2的时候,会创建特别特别多的线程,导致线程使用效率变低