ab测试nodejs比.net响应慢,怎么解
发布于 8 年前 作者 diwu0510 6171 次浏览 来自 问答

情况说明: 局域网内,服务器是组装机,windows server2008,windows版redis,vmware安装centos6.7 c#直接运行在server上,没做特别配置,nodejs运行在虚拟机,启动参数如下 pm2 start app.js -i 3 代码说明: c# 使用 ServiceStack.Redis 操作redis

public class RSClazz
{
    public long Id { get; set; }
    public int ClazzId { get; set; }
    public int Spare { get; set; }
}

public static string Buy(int userId, int clazzId)
{
    try
    {
        using (var redisClient = RedisManager.GetClient())
        {
            var rsClazz = redisClient.GetTypedClient<RSClazz>();
            var rsOrder = redisClient.GetTypedClient<RSOrder>();
            using (rsClazz.AcquireLock())
            {
                var clazz = rsClazz.GetAll().Where(c => c.ClazzId == clazzId).SingleOrDefault();
                if (clazz == null)  return "错误请求";
                if (clazz.Spare == 0) return "班级名额已满";
            }
            catch
            {
                return "失败";
            }
        }

大概就是这样的意思,前线写入100左右的班级,班级的Spare都是0,所以请求到的都是“班级名额已满”

function(){
	exports.buy2 = function(req, res, next){
	var mobile = req.params.m
	var specid = req.params.s

	if(mobile.length != 11 || specid.length != 24){
		return res.json({result: -1, mesg: '无效请求'})
	}
	var key_spare = 'spare:' + specid
	client.get(key_spare,function(err, reply){
		if(err) {
			console.log(err)
		}else{
			if(reply <= 0){
				return res.json({result:0, msg:'没名额了', err:null, debug_msg:'redis名额为空'})
			}
			else{
				async.waterfall([
					...
}

nodejs类似的,前期先写入spare:122这样格式的key,value都是0,所以返回的也都是没有名额了

部署好后,使用ab分别请求,结果是访问iis的-c 1000左右每秒可以完成1000+的请求,而nodejs只能完成700左右,试过多次,无论怎么调整ab的参数,nodejs的响应总比c#低不少,唯一的好处是服务器资源占用没c#那么高

接触nodejs时间不长,不知道是不是代码有什么问题,或是有疏漏的地方,请大家帮忙看看,转nodejs就是听说他效率高,并发好,如果只是这样的表现,还不如多加几台服务器,继续用c#,唉~~~

15 回复

。。你用了vmware不计算损耗的?。。。我醉了

考虑过这个方面,又在windows server2008下安装了一个node,因为windows下没法用pm2,直接node app.js 测下来的数据还不如在虚拟机的

@diwu0510 不用pm2不回自己写cluster么。我从来不觉得pm2好用。第二点。你有用redis+hiredis模块么。

@MiguelValentine 用ioredis吧,它们都是如果hiredis就用hiredis的,效率确实高

pm2貌似比较高大上,下午来调整下,完成后测试数据奉上

下午实现了cluster,连接改用ioredis模块 在本地确实有立竿见影的效果,但是有个问题,开多线程后,经常会在6000请求后出现很明显的卡顿,基本上每次测试都出现这个问题

我大c#怎么会败呢😄 自豪地采用 CNodeJS ionic

nodejs刚入门,水平有限,真没办法把他搞的比c#快

@diwu0510

你具体是怎么测试的?

卡顿的出现可能CPU到了瓶颈,到瓶颈有两种可能,一种是你机器也就能承受6000的并发,还有一种我猜测你可能是同一台机器上跑测试的。

我建议试下linux系统下的情况,测试做得更严谨点。

没有必要测那么高的并发 500并发足够大了 你也很少遇见几千并发的场景

@coordcn 你这不是要c#老命嘛,哈哈

@coordcn 你让C#在Linux下测试呀??

@coordcn C#适合在linux上运行?

@mzTeamMeatMan 有什么不可以的?谁规定c#就只能在windows下运行的?

回到顶部