记一次Node和Go的性能测试

作者 : 开心源码 本文共1404个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共170人阅读

以前简单测过go的性能,高并发场景下的确比node会好少量,一直想找个时间系统性地测一下,手头正好有一台前段时间买的游戏主机,装了ubuntu就开测了

准备工作

  1. 测试机和试压机系统都是ubuntu 18.04.1
  2. 首先安装node和go,版本分别如下:
  3. node 10.13.0
  4. go 1.11
  5. 测试机和试压机修改fd的限制? ulimit -n 100000 ?,否则fd很快就用完了。
  6. 假如是试压机是单机,并且QPS非常高的时候,也许你会经常见到试压机有N多的连接都是?TIME_WAIT?状态,具体起因可以在网上搜一下,执行以下命令就可:
$ sysctl -w net.ipv4.tcp_timestamps=1
$ sysctl -w net.ipv4.tcp_tw_reuse=1
$ sysctl -w net.ipv4.tcp_tw_recycle=1
  1. 测试工具我用的是siege,版本是?3.0.8?。
  2. 测试的js代码和go代码分别如下:

Node(官网的cluster示例代码)

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);

// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}

cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.end('hello world\n');
}).listen(8000);

console.log(`Worker ${process.pid} started`);}

Go

package main
import(
"net/http"
"fmt"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world")
}
func main() {
http.HandleFunc("/", hello);
err := http.ListenAndServe(":8000", nil);
if err != nil {

}
}

开始测试

首先开始并发量的测试,然而。。。游戏主机的CPU是i7-8700K,性能太强,以至于拿了两台mac也没能压满。。。

到处寻觅一番,找到了好几年前花了千把块钱配的nas,上去一看是颗双核的i3-4170,妥了,这下一定没问题

正式开始

跳过了小插曲,直接开测

I/O密集型场景

  • Node – 多进程模型,可以看到由于所有请求都由master进程转发,master进程成为了瓶颈,在CPU占用100%的情况下,worker进程仅仅只占了50%,因而整体CPU利用率只有70%。
  • qps: 6700
记一次Node和Go的性能测试

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 记一次Node和Go的性能测试

发表回复