免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wlmqgzm
打印 上一主题 下一主题

[C++] ASIO,无锁,高并发,高可靠, 统一,网络架构,抗DOS,低端4核心服务器CPU 每秒87万QPS ECHO [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
71 [报告]
发表于 2015-10-28 10:46 |只看该作者
本帖最后由 wlmqgzm 于 2015-10-28 18:00 编辑

socket 的2个设置, 对于ECHO服务器, 数据包比较小, 为提高效率, 设置no_delay
  //  设置socket no_delay, keepalive
  socket1.set_option( boost::asio::ip::tcp::no_delay(true) );

keep_alive最终没有设置, 因为自己代码中的read_wait_timeout超时管理的效率更高, 也可以实现类似的效果.
//  socket1.set_option( boost::asio::socket_base::keep_alive(true) );
//  set_socket_keepalive_param(  socket_handle );

/*
socket keepalive 参数设置,  client掉电后, 大约19秒, 服务器端将检测到.
void set_socket_keepalive_param( int socket_handle )
{
  int32_t  timeout = 10;           // 如果在8秒内没有任何数据交互,则进行探测. 缺省值:7200(s)
  int32_t  cnt = 3;               // 探测时发探测包的时间间隔为2秒. 缺省值:75(s)
  int32_t  intverval = 3;    // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)
  //int32_t keep_alive = 1;          // 开启keepalive属性. 缺省值: 0(关闭)
  //setsockopt( socket_handle, SOL_SOCKET, SO_KEEPALIVE, (void*)&keep_alive, sizeof(keep_alive) );
  setsockopt( socket_handle, SOL_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout) );
  setsockopt( socket_handle, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt) );
  setsockopt( socket_handle, SOL_TCP, TCP_KEEPINTVL, &intverval, sizeof(intverval) );
  return;
}   */

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
72 [报告]
发表于 2015-10-28 16:56 |只看该作者
......再看一下, 发现标题多了"抗DOS, 自修复协议栈".........................

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
73 [报告]
发表于 2015-10-28 17:03 |只看该作者
本帖最后由 wlmqgzm 于 2015-10-28 22:37 编辑

目前ECHO SERVER代码继续改进,
已经改进为 work数量=逻辑CPU数量,
其中1个work是后台管理(单线程), 1个work是acceptor(单线程),  其余的work是驱动read/write handler(每个work1-2线程, 可设置),
每个socket 在accept后, 取得work vector中的一个,
每个socket 只能被一个work驱动, 并且固定, 每个socket内部流程是单线程的,
多个socket 在接入时, 被平均分配给 work vector中的一个, 固定下来,
每个work有1个线程, 则可以同时处理1个socket的异步事件,
每个work有2个线程, 则可以同时处理2个socket的异步事件,

测试表明每个work的IO_SERVICE由一个线程驱动的情况下,效率最高, 但是存在一定的任务不平衡的问题. 即有的work忙一些, 队列任务多一些; 有的队列任务少, 可能处于等待; 降低了总体CPU占有率, 不能实现忙时100%的CPU占有率, 但是这个是最彻底无锁的, 连ASIO的底层队列也基本无锁了.
如果要实现各work的IO_SERVICE的任务平衡, 则由2个线程驱动, 此时, 平衡性解决了, 并且ASIO底层的锁冲突也比较小. 因为每个ASIO底层队列最多只有2个线程竞争锁.  任务队列会有0---2个线程同时并发处理, 基本可以占满忙时CPU占有率, 达到接近100%的CPU占有率. 可以适应2-1024个逻辑CPU的各类服务器.

最新的模式, 可以适应上百CPU的超级服务器的工作, 底层每个epoll事件由2个线程驱动, 解决了平衡性问题, 也缓和了锁冲突问题. 虽然性能不是最高,
但是这种模式比较平衡, 也可以适应2-1024个逻辑CPU的各类服务器.

下面是每个work下的IO_SERVICE由一个线程驱动的测试情况:  大约32.5万QPS ECHO.

guo@guo-desktop:~$ ab -n 10000000 -c 100 -k h ttp://127.0.0.1:1971/jjjjjjjjjjjjj
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd,
Licensed to The Apache Software Foundation,

Benchmarking 127.0.0.1 (be patient)
Completed 1000000 requests
Completed 2000000 requests
Completed 3000000 requests
Completed 4000000 requests
Completed 5000000 requests
Completed 6000000 requests
Completed 7000000 requests
Completed 8000000 requests
Completed 9000000 requests
Completed 10000000 requests
Finished 10000000 requests


Server Software:        
Server Hostname:        127.0.0.1
Server Port:            1971

Document Path:          /jjjjjjjjjjjjj
Document Length:        0 bytes

Concurrency Level:      100
Time taken for tests:   30.772 seconds
Complete requests:      10000000
Failed requests:        0
Non-2xx responses:      10000000
Keep-Alive requests:    10000000
Total transferred:      1190000000 bytes
HTML transferred:       0 bytes
Requests per second:    324973.15 [#/sec] (mean)
Time per request:       0.308 [ms] (mean)
Time per request:       0.003 [ms] (mean, across all concurrent requests)
Transfer rate:          37765.43 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:     0    0   1.1      0      21
Waiting:        0    0   1.1      0      21
Total:          0    0   1.1      0      21

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      3
  99%      8
100%     21 (longest request)
guo@guo-desktop:~$

下面是每个work(处理read/write handler的work,数量=(逻辑CPU数量-1) )下的IO_SERVICE由2个线程驱动的测试情况:  大约31.4万QPS ECHO, 性能略有下降.
各方面比较平衡.  

guo@guo-desktop:~$ ab -n 10000000 -c 100 -k htt p://127.0.0.1:1971/jjjjjjjjjjjjj
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd,
Licensed to The Apache Software Foundation,

Benchmarking 127.0.0.1 (be patient)
Completed 1000000 requests
Completed 2000000 requests
Completed 3000000 requests
Completed 4000000 requests
Completed 5000000 requests
Completed 6000000 requests
Completed 7000000 requests
Completed 8000000 requests
Completed 9000000 requests
Completed 10000000 requests
Finished 10000000 requests


Server Software:        
Server Hostname:        127.0.0.1
Server Port:            1971

Document Path:          /jjjjjjjjjjjjj
Document Length:        0 bytes

Concurrency Level:      100
Time taken for tests:   31.862 seconds
Complete requests:      10000000
Failed requests:        0
Non-2xx responses:      10000000
Keep-Alive requests:    10000000
Total transferred:      1190000000 bytes
HTML transferred:       0 bytes
Requests per second:    313853.52 [#/sec] (mean)
Time per request:       0.319 [ms] (mean)
Time per request:       0.003 [ms] (mean, across all concurrent requests)
Transfer rate:          36473.21 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:     0    0   1.0      0      36
Waiting:        0    0   1.0      0      36
Total:          0    0   1.0      0      36

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      1
  99%      4
100%     36 (longest request)
guo@guo-desktop:~$

总是不断的有新的改进, 呵呵呵, 看来服务器代码确实跟一般软件不太一样.

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
74 [报告]
发表于 2015-10-28 18:07 |只看该作者
本帖最后由 wlmqgzm 于 2015-10-28 18:29 编辑

回复 72# hanxin83

抗DOS代码已经合并到最后服务器的代码中,  默认是打开的, 默认设置每个IP最大120个连接(可修改), 超过数量的连接将被拒绝.

自修复协议栈, 这个是选配的模块, 还在调测中......

   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
75 [报告]
发表于 2015-10-28 18:42 |只看该作者
本帖最后由 wlmqgzm 于 2015-10-28 19:19 编辑

回复 2# windoze

最终修改代码, 想办法 把BOOST ASIO 的IO_SERVICE队列中的锁也去掉了,  呵呵呵呵呵

现在代码设置了一堆的IO_SERVICE,  放到vector中, 依次给 socket 使用.

参数multi,  处理收发IO_SERVICE的数量=逻辑CPU数量 乘以 multi,

如果muti=1, 则  每个work下的IO_SERVICE由一个线程驱动的测试情况:  大约32.5万QPS ECHO.

如果muti=2, 则  每个work下的IO_SERVICE由2个线程驱动的测试情况:  大约31.4万QPS ECHO.

现在socket连接的收发处理中, 代码本身无锁, 但是底层对象唯一有锁的地方, 就是一个std::shared_ptr, 内部引用计数有锁, 个人也测试过, 更改为裸指针, 性能几乎无变化,
大约每次ECHO, 对应2次shared_ptr的使用, 单独对比测试std::shared_ptr和裸指针, 大约1000万ECHO, 可以节约0.2秒. 不超过1%的变化
个人认为宁可不改, 因为有裸指针的代码, 可信度降低不少.

多线程代码中减少锁的使用, 降低锁冲突, 可以提高性能.
   

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
76 [报告]
发表于 2015-10-28 20:54 |只看该作者
本帖最后由 windoze 于 2015-10-28 20:56 编辑

回复 75# wlmqgzm

每一/二个线程一个io_service没别的问题,就是容易出现负载不平衡,有的连接忙死,有的连接闲死,你还没法挪……不过大多数情况下这不是个大问题。

另外shared_ptr的引用计数没有锁,只是个atomic<size_t>


接下来你可以做一下线程/CPU绑定,把malloc/new换成内存池,还能再榨出点性能来。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
77 [报告]
发表于 2015-10-28 22:58 |只看该作者
本帖最后由 wlmqgzm 于 2015-10-29 11:06 编辑

自修复协议栈, 内部校验用的,  Crc32c部分的代码. 全部是自己敲出来的代码, 版权所有.

硬件CRC32的全部代码, 用于实现高速校验的.    利用Intel SSE4.2指令实现超高速硬件级CRC32校验
  1. #include <cpuid.h>
  2. #include <boost/crc.hpp>
  3. #include "error_message.hpp"

  4. #ifndef _crc32c_hpp
  5. #define _crc32c_hpp

  6. class Crc32c
  7. {
  8.   public:
  9.     Crc32c();
  10.     unsigned int value( const char *chars, unsigned int int_length );
  11.     unsigned int value( std::string &str_in );

  12. #ifdef DEBUG
  13.     int test( const char *chars=NULL, unsigned int int_length=0 );
  14. #endif // DEBUG

  15.   private:
  16.     boost::crc_optimal<32, 0x1EDC6F41, 0, 0, true, true>  boost_crc1;
  17.     bool is_select_sse_u64;
  18.     bool is_select_sse_u8;

  19.     unsigned int intel_crc32c_u8( const char *chars, unsigned int int_length );
  20.     unsigned int intel_crc32c_u64( const char *chars, unsigned int int_length );
  21.     bool bool_cpu_is_support_sse4_2(void);
  22.     unsigned int boost_crc32c_u8( const char *chars, unsigned int int_length );
  23. };


  24. Crc32c::Crc32c()
  25. {
  26.   char *chars = NULL;
  27.   unsigned int  address_size = sizeof(chars);   //  =8判断地址长度是64位, =4判断是32位

  28.   is_select_sse_u64 = false;
  29.   is_select_sse_u8   = false;

  30.   if( bool_cpu_is_support_sse4_2() )  {
  31.     if(address_size>=8)    is_select_sse_u64 = true;  //  =8判断地址长度是64位, =4判断是32位
  32.     else                                is_select_sse_u8    = true;
  33.     }
  34.   return;
  35. }


  36. unsigned int Crc32c::intel_crc32c_u8( const char *chars, unsigned int int_length )
  37. {
  38.   const char *p_begin;
  39.   const char *p_end;
  40.   unsigned int  int_crc = 0;

  41.   p_begin = chars;
  42.   p_end    = chars + int_length;

  43.   while(  p_begin < p_end )  {
  44.     int_crc = _mm_crc32_u8(int_crc,*p_begin);
  45.     ++p_begin;
  46.     continue;
  47.     }
  48.   return int_crc;
  49. }


  50. //  要求  支持64位CPU指令, 支持SSE4.2
  51. //  运行64位系统,  测试发现即使不是8字节位对齐,也可以正常运行
  52. unsigned int Crc32c::intel_crc32c_u64( const char *chars, unsigned int int_length )
  53. {
  54.   unsigned long long *long_begin;
  55.   unsigned long long *long_end;
  56.   unsigned int  i  ;
  57.   unsigned int  n ;

  58.   unsigned int long_long_size = sizeof(unsigned long long);
  59.   //if( int_length<long_long_size)    return intel_crc32c_u8( chars, int_length );
  60.   //  可省略, 可以处理特殊情况

  61.   unsigned int  int_crc = 0;
  62.   long_begin =  (unsigned long long*) chars;
  63.   long_end    = long_begin + (int_length/long_long_size);

  64.   while( long_begin < long_end  ) {
  65.     int_crc = _mm_crc32_u64(int_crc, *long_begin);
  66.     ++long_begin;
  67.     continue;
  68.     }

  69.   i  = int_length/long_long_size*long_long_size;
  70.   n = int_length;
  71.   while(  i < n )  {
  72.     int_crc = _mm_crc32_u8(int_crc,chars[i]);
  73.     ++i;
  74.     continue;
  75.     }
  76.   return int_crc;
  77. }


  78.     /*   判断处理器是否支持SSE4.2,应采取如下方法:    true if CPUID.01H:ECX.SSE4_2[bit 20] = 1
  79.     eax == 1,则在eax中返回Family/Model/Stepping等信息,   在EBX   ECX和EDX返回一些信息
  80. //   ecx  define bit_SSE4_2        (1 << 20)    */
  81. bool Crc32c::bool_cpu_is_support_sse4_2(void)
  82. {
  83. #ifdef  __cpuid    // 在cpuid.h中定义
  84.   unsigned int eax, ebx, ecx, edx;

  85.   __cpuid(1, eax, ebx, ecx, edx);
  86.   if(ecx & bit_SSE4_2)  {
  87.      //log_message("cpu support SSE4.2",5);
  88.      return true;
  89.      }
  90. #endif //  __cpuid
  91.   if( g_display_level_default>=2 )  warn_message("__cpuid define  not find.  No use intel sse4.2 in crc32c. ");
  92.   return false;
  93. }


  94. unsigned int Crc32c::boost_crc32c_u8( const char *chars, unsigned int int_length )
  95. {
  96.   boost_crc1.reset(0);
  97.   boost_crc1.process_bytes(chars, int_length);
  98.   return boost_crc1.checksum();
  99. }


  100. unsigned int Crc32c::value( const char *chars, unsigned int int_length )
  101. {
  102.   if( is_select_sse_u64 )  {
  103.     return intel_crc32c_u64( chars, int_length );
  104.     }
  105.   //  32位系统,选择最简单的单字节提交,  不考虑做优化32位的代码了,因为32位系统已经淘汰了,不值得做更多代码
  106.   if(is_select_sse_u8)  {
  107.     return intel_crc32c_u8( chars, int_length );
  108.     }
  109.   //  不支持SSE4.2的CPU, 还是软件方式吧.
  110.   return boost_crc32c_u8( chars, int_length );
  111. }


  112. unsigned int Crc32c::value( std::string &str_in )
  113. {
  114.   if( is_select_sse_u64 )  {
  115.     return intel_crc32c_u64( str_in.c_str(), str_in.length() );
  116.     }
  117.   //  32位系统,选择最简单的单字节提交,  不考虑做优化32位的代码了,因为32位系统已经淘汰了,不值得做更多代码
  118.   if(is_select_sse_u8)  {
  119.     return intel_crc32c_u8( str_in.c_str(), str_in.length() );
  120.     }
  121.   //  不支持SSE4.2的CPU, 还是软件方式吧.
  122.   return boost_crc32c_u8( str_in.c_str(), str_in.length() );
  123. }


  124. //  下面为开发过程中的测试程序,  已经验证了程序的正确性.
  125. #ifdef DEBUG
  126. int Crc32c::test( const char *chars_in, unsigned int int_length_in)
  127. {
  128.   int int_ret1;
  129.   int int_ret2;
  130.   int int_ret3;
  131.   int int_ret = 0;

  132.   char *chars ;
  133.   unsigned int int_length=10000000;
  134.   unsigned int i;
  135.   bool  bool_chars_need_delete;

  136.   if(0==int_length_in||NULL==chars_in)  {
  137.      chars = new char[int_length];
  138.      if(NULL==chars) {
  139.         error_message("memory require failed.");
  140.         return -1;
  141.         }
  142.      bool_chars_need_delete = true;
  143.      for (i = 0; i <int_length; ++i)     chars[i] = i;
  144.      }
  145.   else {
  146.     int_length = int_length_in;
  147.     chars = (char *)chars_in;
  148.     bool_chars_need_delete = false;
  149.     }

  150.   for(i=0;i<2;++i)  {   // 循环执行2次
  151.   {
  152.     boost::timer::auto_cpu_timer   a1;
  153.     int_ret1 = boost_crc32c_u8( chars, int_length );
  154.     log_message_int("boost_crc32c_u8",int_ret1);
  155.   }
  156.   {
  157.     boost::timer::auto_cpu_timer   a2;
  158.     int_ret2 = intel_crc32c_u8( chars, int_length );
  159.     log_message_int("intel_crc32c_u8",int_ret2);
  160.   }
  161.   {
  162.     boost::timer::auto_cpu_timer   a3;
  163.     int_ret3 = intel_crc32c_u64( chars, int_length );
  164.     log_message_int("intel_crc32c_u64",int_ret3);
  165.   }
  166.   if(int_ret1!=int_ret2)  {
  167.     int_ret = -2;
  168.     error_message("boost_crc32c_u8 <> intel_crc32c_u8. ");
  169.     }
  170.   if(int_ret2!=int_ret3)   {
  171.     int_ret = -3;
  172.     error_message("intel_crc32c_u8 <> intel_crc32c_u64");
  173.     }
  174.   }

  175.   if(bool_chars_need_delete && NULL!=chars)  {
  176.      delete chars;
  177.      chars = NULL;
  178.      }
  179.   if(0==int_ret)    log_message("crc32c test run ok. no error find. ");
  180.   return  int_ret;
  181. }
  182. #endif // DEBUG

  183. #endif // _crc32c_hpp
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
78 [报告]
发表于 2015-10-29 16:09 |只看该作者
wlmqgzm 发表于 2015-10-28 18:42
回复 2# windoze

最终修改代码, 想办法 把BOOST ASIO 的IO_SERVICE队列中的锁也去掉了,  呵呵呵呵呵

客户端服务器都在一个机器上吗?
我怎么感觉跨百兆网有点够呛。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
79 [报告]
发表于 2015-10-29 21:23 |只看该作者
本帖最后由 wlmqgzm 于 2015-10-29 21:25 编辑

回复 78# yulihua49

百兆网肯定不行, 至少得千兆网络, 否则软件处理能力够, 但是瓶颈都在网络上,  目前大约400Mbit/s,  还在做代码中, 先本机测试吧, 简单方便, 以后再详细测.

现在 Transfer rate:  37141.80 [Kbytes/sec] received,  

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
80 [报告]
发表于 2015-10-29 22:13 |只看该作者
http://bbs.chinaunix.net/thread-4082130-1-2.html
千万级并发实现的秘密:内核不是解决方案,而是问题所在!

摘要:C10K问题让我们意识到:当并发连接达到10K时,选择不同的解决方案,笔记本性能可能会超过16核服务器。对于C10K问题,我们或绕过,或克服;然而随着并发逐渐增多,在这个后10K的时代里,你是否有想过如何去克服C10M。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP