游客 你可以选择到 登录 注册帐号 忘记密码?
  • 服务热线:
    13999268016
您现在的位置:首页主页 > 解决方案 > 网络层解决方案 >
网络层方案
一、网络层特性

   网络层的设计使用了keep_live进行自动循环检测,定时扫描,每秒进行1次扫描有没有拆掉的线程。为保证不会造成数据的丢失,和普通的简单的网络层处理流程相比,我们最主要的区别体现在close上,是通过一系列的复杂流程close:通过向客户端发送shutdown状态,让客户端检测到并主动发起拆线请求,使服务器端在正常拆线后不会出现time_wait的情况,并要让time_wait留在客户端,除非客户端响应超时的极少数情况time_wait状态会留在服务器端,这样极大的提高了服务器端的处理性能。
具体流程如下:
      
haisql_memcache在发送数据时,如果检测到有多条数据需要连续发送,先设置TCP延迟发送, 将多个分组输出到TCP缓冲区,最后再取消TCP延迟发送,告诉TCP底层马上发送,即使分组非常多且体积小,在TCP底层也会自动合并,减少了TCP/IP数据包的数量,提高了网络层的效率。
     当需要关闭连接时, 服务器端先执行shutdown_receive, 将在服务器收缓存末尾插入一个文件EOF标志,如果客户端此时继续发送命令是可以检测到此标志,无法发送,此时,服务器发送缓冲区如果有数据,还可以继续发送,服务器端继续收数据,直到收缓冲区数据全部读干净,服务器还可以继续处理收缓存中的数据,服务器收数据将检测到EOF标志,说明已经没有收数据要处理了,服务器端执行shutdown_send, 将在服务器发缓存末尾插入一个文件EOF标志,此时发送端并没有停止发送,继续发送发缓冲中的全部数据,直到最后发送EOF标志,一般客户端将可以检测到此标志,并主动拆线,此期间服务器端一直在等待客户端主动拆线,超时后才会进行主动关闭(close)。

    默认传统的TCP参数有delay延迟,写进的数据会在一定的延迟后才能发送,发送非常慢,而haisql_memcache在发送数据时,如果需要转发的内容有多组,则先设置delay,依次将多个分组输出到TCP缓冲区,最后再设置nodelay,告诉TCP底层马上发送,这样即使转发的分组非常多并且体积比较小,在TCP底层也会自动合并,减少了TCP/IP数据包的数量,因此大大提高了网络层的效率。同时网络层的管理模块对于有可能冲突的数据采用线程内部对象,外部调用通过boost::io_service多任务队列指定线程处理, 对于部分不影响最终逻辑的数据采用管理线程单线程无锁处理来提供低开销下的高性能处理。

   
 网络层基于C++标准库std和C++准标准库boost的各类函数,兼容各种操作系统,易于移植,尤其是基于boost::asio异步IO的组件,实现了异步高并发。

   
网络层的高并发高性能,在内存足够的情况下,单机并发数量是没有上限的,理论上可以支持百万以上连接同时并发(需要设置系统的最大打开文件句柄数量,需要设置TCP socket数量等限制)。 网络层采用异步IO多线程多CPU同时并发处理的方式,可以实现极高的处理流量,一组收发包的平均网络层处理时长压缩到了5微秒左右(intel 3.4G四核CPU linux下测试),可以充分发挥多核CPU的处理能力,因此,多核CPU下内存数据库的总处理性能可以达到16万~24万TPS的性能。
二、网络层健壮性测试

主要的优化思路是:考虑使用异步和同步混合模式,以及一些参数更改。
    1)读数据之前,先看一下 读缓冲区中有多少数据可以用于读取,如果已经有数据可以读取,那么就直接read_some读取,用同步的方式读取, 如果没有数据可读,则使用异步读取注册call_back函数。
这样在有数据可读的情况下,减少一次读函数入任务队列和出任务队列的开销。
    2)写数据时,先尝试write_some同步写入,如果能够写入全部,则不用注册异步写入的callback了,写入部分则将字符串截断为substr, 只保留没有写入的部分,再注册异步写入的callback。
这样在写缓冲区有空闲空间的情况下,减少一次写函数入任务队列和出任务队列的开销。
    3)在写数据前检查 写入的数据是否是一组string,如果是一组string, 则先设置no_delay为false, 意思是delay延迟发送, 这样可以尽量合并string的内容为更大的IP包,提高IP包的效率,当全部strings都写入缓冲区完成后,再设置no_delay为true, 意思是立即发送,不要延迟等待。单string默认就是no_delay为true, 不需要修改。
    为了提高健壮性,在所有的read/write操作之前,添加了额外的底层代码,检查是否处于拆线状态,解决了问题。
    在进行长时间类似的非标TCP/IP协议乱序冲击测试下,发现无论是否增加检测代码,多线程同步模式都有可能会崩溃,而单线程同步模式抗住了冲击,多线程异步模式+保护性检测代码也抗住了冲击,健壮性可以得到充分的保证。

 

 
咨询热线:13999268016
地址:新疆维吾尔自治区乌鲁木齐市水磨沟区南湖东路77号新疆上海科技合作基地八层801室 固话:6583723
返回首页 | 网站地图 | 联系我们
技术支持:创世网络
乌鲁木齐云山云海信息技术有限责任公司 版权所有 备案号:新ICP备17001390号
新公网安备 65010502000200号
网站访问人数: