Bun Web vs PM2 Cluster (with Express web)
· 5 min read
Bun.js 以高性能为卖点,而 PM2 可以提供nodejs作为服务的解决方案,而且支持cluster模式,可以最大限度的利用现代多核CPU性能。
但是我更关心 Bun.js 性能是否强到我来自己注册服务 来替换 PM2。
Bun
Bun 是一个高性能的 JavaScript 运行时,旨在提供 Node.js 的功能,同时提供更快的启动速度和更小的内存占用。它支持 ES6 模块,TypeScript,以及原生的 WebAssembly。Bun 还内置了一个 HTTP 服务器,使得开发和部署 Web 应用程序变得更加简单。
- 第一次运行
█ TOTAL RESULTS
HTTP
http_req_duration..............: avg=1.61ms min=274.48µs med=1.2ms max=39.05ms p(90)=2.77ms p(95)=3.87ms
{ expected_response:true }...: avg=1.61ms min=274.48µs med=1.2ms max=39.05ms p(90)=2.77ms p(95)=3.87ms
http_req_failed................: 0.00% 0 out of 42199
http_reqs......................: 42199 233.748209/s
EXECUTION
iteration_duration.............: avg=1s min=1s med=1s max=1.04s p(90)=1s p(95)=1s
iterations.....................: 42199 233.748209/s
vus............................: 4 min=4 max=500
vus_max........................: 500 min=500 max=500
NETWORK
data_received..................: 6.2 MB 35 kB/s
data_sent......................: 3.0 MB 16 kB/s
running (3m00.5s), 000/500 VUs, 42199 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
- 第二 次运行
█ TOTAL RESULTS
HTTP
http_req_duration..............: avg=1.62ms min=241.31µs med=1.2ms max=71.94ms p(90)=2.66ms p(95)=3.59ms
{ expected_response:true }...: avg=1.62ms min=241.31µs med=1.2ms max=71.94ms p(90)=2.66ms p(95)=3.59ms
http_req_failed................: 0.00% 0 out of 42196
http_reqs......................: 42196 233.695522/s
EXECUTION
iteration_duration.............: avg=1s min=1s med=1s max=1.07s p(90)=1s p(95)=1s
iterations.....................: 42196 233.695522/s
vus............................: 4 min=4 max=500
vus_max........................: 500 min=500 max=500
NETWORK
data_received..................: 6.2 MB 35 kB/s
data_sent......................: 3.0 MB 16 kB/s
running (3m00.6s), 000/500 VUs, 42196 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
- 额外的运行
█ TOTAL RESULTS
HTTP
http_req_duration..............: avg=1.5ms min=232.55µs med=1.19ms max=59.78ms p(90)=2.51ms p(95)=3.3ms
{ expected_response:true }...: avg=1.5ms min=232.55µs med=1.19ms max=59.78ms p(90)=2.51ms p(95)=3.3ms
http_req_failed................: 0.00% 0 out of 42205
http_reqs......................: 42205 233.79981/s
EXECUTION
iteration_duration.............: avg=1s min=1s med=1s max=1.06s p(90)=1s p(95)=1s
iterations.....................: 42205 233.79981/s
vus............................: 4 min=4 max=500
vus_max........................: 500 min=500 max=500
NETWORK
data_received..................: 6.2 MB 35 kB/s
data_sent......................: 3.0 MB 16 kB/s
running (3m00.5s), 000/500 VUs, 42205 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
PM2
PM2 是一个用于管理 Node.js 应用程序的进程管理器。它提供了自动重启、负载均衡、集群模式等功能,使得 Node.js 应用程序更加稳定和高效。PM2 还支持多种监控和日志记录功能,使得开发者可以更好地了解应用程序的运行状态。
- 第一次运行
█ TOTAL RESULTS
HTTP
http_req_duration..............: avg=25.6ms min=704.67µs med=2.79ms max=2.75s p(90)=41.28ms p(95)=85.25ms
{ expected_response:true }...: avg=25.6ms min=704.67µs med=2.79ms max=2.75s p(90)=41.28ms p(95)=85.25ms
http_req_failed................: 0.00% 0 out of 41171
http_reqs......................: 41171 227.889771/s
EXECUTION
iteration_duration.............: avg=1.02s min=1s med=1s max=3.77s p(90)=1.04s p(95)=1.09s
iterations.....................: 41171 227.889771/s
vus............................: 1 min=1 max=500
vus_max........................: 500 min=500 max=500
NETWORK
data_received..................: 11 MB 60 kB/s
data_sent......................: 2.9 MB 16 kB/s
running (3m00.7s), 000/500 VUs, 41171 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
- 第二次运行
█ TOTAL RESULTS
HTTP
http_req_duration..............: avg=16.23ms min=662.87µs med=2.47ms max=636.8ms p(90)=34.98ms p(95)=78.24ms
{ expected_response:true }...: avg=16.23ms min=662.87µs med=2.47ms max=636.8ms p(90)=34.98ms p(95)=78.24ms
http_req_failed................: 0.00% 0 out of 41540
http_reqs......................: 41540 230.651456/s
EXECUTION
iteration_duration.............: avg=1.01s min=1s med=1s max=1.63s p(90)=1.03s p(95)=1.08s
iterations.....................: 41540 230.651456/s
vus............................: 3 min=3 max=500
vus_max........................: 500 min=500 max=500
NETWORK
data_received..................: 11 MB 60 kB/s
data_sent......................: 2.9 MB 16 kB/s
running (3m00.1s), 000/500 VUs, 41540 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
K6 Test Script
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
// Key configurations for Stress in this section
stages: [
{ duration: '1m', target: 500 }, // traffic ramp-up from 1 to a higher 200 users over 10 minutes.
{ duration: '1m', target: 200 }, // stay at higher 200 users for 30 minutes
{ duration: '1m', target: 0 }, // ramp-down to 0 users
],
};
export default () => {
const urlRes = http.get('http://localhost:5000');
sleep(1);
// MORE STEPS
// Here you can have more steps or complex script
// Step1
// Step2
// etc.
};
Conclusion
Bun 的性能要远好于 PM2 Cluster(express)。其实 Bun 也不是运行在单线程下的,Bun会自动发起多个线程来处理请求。
而且 Bun 对于 Serverless 应用的兼容性非常好,可以很好的平替(Cloudflare worker)。