mina高并发下响应时间过长的一些失败的尝试及寻求正确方法

问题描述

楼楼做这个mina的服务端的时间大概不到一个月. 楼楼之前主要是做http的编码,对socket的了解也不是很深, 但因为mina的易用性所以整个服务端也算是很快就搭建起来了. 在和客户端对接测试的时候稳定性和服务端的功能也都还算满意.所以兴冲冲的就开始做压力测试了. 压力测试一做就做出来一身冷汗. 楼楼的服务器是4核的,所以服务端启动的ioprocesser=5. 目前最大的问题是: 当session数量到达100以上时. 客户端收到服务端响应的时间大约就要2到3秒, 当同时并发2W时 响应时间居然达到了惊人的2000多秒.而且此时数据库IO操作居然并不繁忙.一个session会每隔几秒有一个操作.每个操作至少会有1次数据库的读写. 在网上也查了很多地方,好像没有人出现过我这种响应时间很长的情况.不知道是不是我哪里配置的不对. 楼楼是临时花了一上午用mina编写压力测试客户端, 使用多线程启动connecter 来建立新session. 1秒建立10个session.(session的建立很顺利,服务端也能很快将session建立起来,就是数据的读写响应时间非常长) 最开始因为有多次的ACK操作在高并发的情况下客户端老是出问题.抛出了无数的异常,然后反过来又引发服务端无数的异常.于是先去除了服务端的ACK操作. 大大的减少了异常的产生. 再然后觉得需要加上响应时间.所以就在 客户端的请求上 附加了时间戳. 服务端返回时将时间戳直接返回来 在比较当前时间戳与发送请求时的时间. 当时就发现这个响应时间在高并发下是一个非常恐怖的数字. 因为在高并发时数据库的读写非常轻松 , 感觉并不是逻辑处理的问题导致响应时间长, 干脆先将所有的功能性的逻辑去除. 将服务端的流程缩短到接收->解码->发送->编码. 但是对缩短响应时间几乎没有影响.. 目前下一步的打算是在session建立时保存时间戳. session有操作时比较时间戳. 看看时间到底是浪费在什么地方. 希望有高手能指点一下出现这种响应时间长的情况是什么问题. 实在没有找到别人也有碰到mina响应时间过长的情况. 看来还是要多补补socket的知识了. 问题补充:我在服务端各个节点加上了时间戳. 目前还没有在客户端加. 下一步在客户端也加上作比较.客户端是在session一创建.就马上把数据发过来了.session创建->开始decode 111846ms开始decode->完成decode 0ms调用messageReceived 63msrecv后马上返回数据开始encode 0ms开始encode->完成encode 0ms完成encode->调用messageSent 13885ms.等下再把客户端的时间轴也发出来...其实整体来看时间主要就是消耗在收到信息这里

解决方案

mina是nio框架。nio框架是用的select 模型,通过在少量线程中 轮换处理当前有数据事件的链接来节省数据资源。因此每次接收到数据后的处理时间不能长,否则会整体性能会很快下降。看上面的时间统计,貌似你的decode处理有问题,不会是直接用read到一个数据包完整接收到的吧?mina应该提供定长数据包的decoder和delim分隔的数据包的decoder的。
解决方案二:
性能瓶颈应该不在processer的数量,processor从channel中读取数据还是很快的,我觉得应该是在读取数据后的过滤链中fireMessageReceived的调用过程这,所以只需要增加线程池过滤器即可,考虑到decode与encode比较耗费时间的情况,可以设置线程池过滤器在编解码过滤器之前。

时间: 2024-12-31 16:51:55

mina高并发下响应时间过长的一些失败的尝试及寻求正确方法的相关文章

vmware vsphere client登录,连接错误,由于远程服务器响应时间过长,请求失败

问题描述 服务器采用的是虚拟机形式,机房有过断电导致服务器死机,目前可重启进入到虚拟机界面,但是通过其他内网前置机安装VM虚拟机客户端却未能成功启动这是什么情况,该怎么解决. 解决方案

Spring高并发下Cglib代理性能问题

问题描述 这两天做压力测试(服务器是IBMP7508C32G),高并发下如果用反射直接调用一个简单的服务(空方法,直接return)TPS大概能到将近300,如果用Spring的applicationContextgetBean来获取服务对象调用的话(服务bean是prototype类型),TPS只有不到90.在日志里记录了一下执行时间,用反射调用服务执行时间基本在10毫秒以内,但是用Spring的ApplicationContext执行时间在1秒左右.这样的问题是不是cglib代理引起的?有什

服务器响应时间很长, 求排查

问题描述 服务器响应时间很长, 求排查 最近几天发现服务器访问时长有问题 4台应用服务器, 负载均衡(指定负载), 有个页面(有计算) 平均响应时间10s+,有时甚至更长, 但是应用服务器 和 数据库服务器 cpu及内存使用率都不高. 数据量(1表 6000) (2表 10+) 已做缓存, 主要计算流程 2个表进行全表关联取笛卡尔积,计算(计算量不是太大) 组装数据 排序 分页. (现在日志记录不是太详情, 无法从日志入手 而且基本操作不了服务器,运维专责 擦!) 过了中午, 访问正常 1s左右

Win7程序响应时间过长怎么办

  Win7程序响应时间过长怎么办? Windows 7中,系统集成的搜索功能非常的强大,只要用户打开开始菜单并开始输入搜索内容,无论要查找应用程序.文本文档等,搜索功能都能自动运行,给用户的操作带来极大的便利.但是也有人反映程序响应时间比较长. 下面,我们就来看看如何缩短程序响应时间. 第一步.在开始菜单搜索框输入 "regedit" ,然后回车就打开了注册表编辑器. 第二步.依次展开注册表项"HKEY_CURRENT_USERControl PanelDesktop&qu

并发读写缓存实现机制:高并发下数据写入与过期

一般来说并发的读取和写入是一对矛盾体,而缓存的过期移除和持久化则是另一对矛盾体.这一节,我们着重来了解下高并发情况下缓存的写入.过期控制及周边相关功能.系列文章目录:并发读写缓存实现机制(零):缓存操作指南并发读写缓存实现机制(一):为什么ConcurrentHashMap可以这么快?并发读写缓存实现机制(二):高并发下数据写入与过期并发读写缓存实现机制(三):API封装和简化1.高效的数据写入(put)    在研究写入机制之前,我们先来回顾下上一节的内容.ConcurrentHashMap之

php结合redis高并发下发帖、发微博的实现方法_php实例

发帖.发微博.点赞.评论等这些操作很频繁的动作如果并发量小,直接入库是最简单的 但是并发量一大,数据库肯定扛不住,这时可采取延迟发布:先将发布动作保存在队列里,后台进程循环获取再入库 模拟发布微博先进入redis队列 weibo_redis.php <?php //此处需要安装phpredis扩展 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth("php001"); //连接

请问网站的高宽是采用定长还是采用百分比啊?

问题描述 请问网站的高宽是采用定长还是采用百分比啊? 现在网站的高宽一般有二种办法,一定是定长,一种是百分比,那么一般是采用哪种办法呢? 解决方案 看自己的网站需要吧.如果公司是做html5 app的就采用百分比,如果只有pc端还是用px好点.如果都有,建议写两套 解决方案二: 如果用百分比来限定宽度,排版大量的文字.对于那种2k 4k的显示器来说,是一种灾难.没有人愿意阅读过长的文本 解决方案三: 看具体情况.用的比较多的是960px或者1000px居中. 解决方案四: 这个肯定是要看实际的情

asp.net 高并发下 一个web页面同时调用2个方法,这2个方法都是查询数据库,查询的结果乱掉了

问题描述 asp.net 高并发下 一个web页面同时调用2个方法,这2个方法都是查询数据库,查询的结果乱掉了 问题描述:这个问题只有在高并发情况下才会出现. 具体如下: 后台.cs有2个方法,这2个方法在前端.aspx通过流的方式调用(<%%>),然而DaoJiShi()这个方法获得的是gd()方法的数据,gd()获得的是DaoJiShi()方法的数据,那么在相应的方法里遍历DaTable的时候就会报列不存的情况. 这个问题让我很困惑,这样写已经很多项目了,都没这个问题.这个项目有时候会高并

一个关于HashMap高并发下死循环的问题.

问题描述 当前系统在高并发下出现进程CPU占用很高的问题.即使没有处理业务.也占用很高.后定位出原因可能是HashMap在高并发条件下会死循环.有两个问题想请问下:1.出现死循环的话.是否还会回复原样?即HashMap死循环是因为元素的问题.但元素时刻都在改变.是否会出现自动死循环自动修复?2.现在想重现这个死循环条件.但重现很难.高并发访问下出现几率也比较低.请问有没有什么好办法可以提高重现几率. 问题补充:freish 写道 解决方案 1.高并发场景下HashMap可能会形成闭环,导致死循环