隐藏

c#---Socean.RPC实测[并发量13w][响应时间0.04ms]

发布:2021/3/6 8:38:27作者:管理员 来源:本站 浏览次数:800

前言

经过一段时间的优化,Socean.RPC的性能又提高了一些,不过这差不多是socketAPM模型的极限了,已经很难再提升了。本框架仅仅2000多行代码,无第三方框架引用,在普通PC上测试大约并发量13w、响应时间0.04ms,基本上实现了本框架的最初设计目的----用少量的代码实现一个高性能、高稳定性、高响应速度的RPC框架,不过跟其他RPC框架相比还少了动态代理这一块,先用常规序列化吧,以后应该会加上。


本次测试是在笔记本上运行的,CPU是i5 6200U(双核),测试客户端和测试服务端都是在一台笔记本上,所以并发量肯定比只跑测试服务端低些,测试代码都在github上,有兴趣的同学可以自己下载测试

 

开始测试

首先是单线程测试,图中可以看到,平均处理量大约2.7W条每秒,响应时间大约0.037ms每条

 技术图片

接着是3个线程测试,平均处理量大约7W条每秒,响应时间大约0.043ms每条(这里之所以测试3线程,主要是因为测试笔记本是双核四线程,还有一个线程是空闲状态,这里模拟的是高负载运行状态,响应速度还是很快的)

 技术图片

 

最后是30个线程压测,此时基本是满负载测试了,平均处理量大约10W条每秒,响应时间大约0.29ms每条,此时server的CPU使用率大约是30%,client的CPU使用率大约是45%,机器整体的CPU使用率在90%以上,如果测试笔记本只运行server的话,理论上13w条每秒应该是不成问题的

 技术图片

 

本次测试使用的是双核笔记本进行的,所以并发只能到13w,如果运行在20核(最新的应该是48核了吧)的服务器上,并发到40w每秒是没问题的

 

项目地址
https://github.com/ch00486259/Socean.Rpc

其他
利用本RPC框架做其他组件能节省很多时间

1.服务网关,rpcserver的messageprocessor支持异步,可以做到每秒10W+的rpc请求透传,路由信息可存于消息的HeaderExtention中,HeaderExtention专为Gateway定制
2.缓存,经过简单的封装即可实现一个简易缓存,配合一致性hash可实现简易分布式功能(单机redis每秒处理量也在10w+,redis的瓶颈应该也是在网络这,双核电脑上rps达到10w+后再想提升是很难了)
3.分布式计算、大数据,由于本框架的高速响应的特点,可用于分布式计算、大数据等高响应速度的场景

 

简介

Socean.RPC是一个.Net下的高性可以RPC框架,框架以高性可以、高稳定性为目标,底层基于socket,代码简洁,总代码量大约在2000行,无第三方库引用,框架性可以较高,在双核i5笔记本上可达10w+每秒的处理量,支持10000长连接消息发送(每秒发10个短消息),均稳定运行,内存和cpu占有率偏低

开发背景

好用的轮子太少,只可以自己弄个了,希望可以促进.Net社区的发展

使用介绍

server sample :

1.定义实体

public class Book
{ public string Name { get; set; }
}

 定义MessageProcessor

public class DefaultMessageProcessor : IMessageProcessor
{ public ResponseBase Process(string title, byte[] contentBytes)
  { if (title == "book/name/change")
    { var content = Encoding.UTF8.GetString(contentBytes); //here we use newtonsoft.Json serializer //you need add refer "newtonsoft.Json.dll" var book = JsonConvert.DeserializeObject<Book>(content);
      book.Name = "new name"; var responseContent = JsonConvert.SerializeObject(book); return new BytesResponse(Encoding.UTF8.GetBytes(responseContent));
    } if (title == "empty")
    { return new EmptyResponse();
    } return new ErrorResponse(ResponseErrorCode.SERVICE_NOT_FOUND);
  }
}

 

2.启动服务

var server = new KeepAliveRpcServer();
server.Bind(IPAddress.Any, 11111);
server.AutoReconnect = true;
server.MessageProcessor = new DefaultMessageProcessor();

server.Start(); 

 

client sample:

1.定义实体

public class Book
{ public string Name { get; set; }
}

2.Run调用

public Book ChangeBookName(Book book)
{ using (var rpcClient = ShortConnectionRpcClientFactory.Create(IPAddress.Parse("127.0.0.1"), 11111))
  { var requestContent = JsonConvert.SerializeObject(book); var response = rpcClient.Query("book/name/change", Encoding.UTF8.GetBytes(requestContent)); var content = Encoding.UTF8.GetString(response.ContentBytes); return JsonConvert.DeserializeObject<Book>(content);
  }
}

其他

NetworkSettings类可修改连接超时时间等参数

若果要进行性可以测试(load test),最好是在客户端把NetworkSettings.ClientDetectReceiveInterval设置成1,并提升线程优先级至ThreadPriority.Highest

项目地址

https://github.com/ch00486259/Socean.Rpc

最高并发处理量应该在30w以上,谁要是有40核服务器,可以帮我测试下