关于skynet 中udp的使用

240 views
Skip to first unread message

姚新明

unread,
Jul 19, 2016, 8:43:51 AM7/19/16
to skynet-users
云风:
目前项目中使用skynet做媒体服务器,在单一UDP端口,8核cpu下目前网络发送能力在600M左右,客户希望能提高网络的能力,目前的想法是增加线程来提高网络能力,初步的想法为:

使用SO_REUSEPORT来实现多线程绑定到同一个端口,系统初始化一个socket_server数组,每个线程使用一个skyent中的socket_server来poll数据,返回
给lua层的id带上socket_server在数组的索引。

另外目前udp的发送方式是否可以调整为直接将fd返回给lua层,发送的时候直接sendto就可以,而不需要socket_server线程来发送?



谢谢。

云风 Cloud Wu

unread,
Jul 19, 2016, 10:18:24 AM7/19/16
to skynet-users
我觉得比较简单的尝试可以同一台机器启两个 skynet 进程。看看是否可以提高吞吐量。如果你的媒体数据块很大,完全可以用共享内存做两个 skynet 进程间共享。然后在给 skynet 写个 C 服务去控制/管理这个共享内存。

不过在单块网卡的情况下,我觉得多个 poll 未必能提高性能。

如果你认为 udp 可以直接调用系统的 sendto . 我想你直接写个 C 服务,用它直接调用 sendto (阻塞模式), 然后别的服务再给它发消息就好了。
如此最坏情况不过这个 C 服务占用了一个工作线程而已。(如果上面你指的 IO 仅是发送能力,我认为这样就可以利用多个 C 服务尝试并行发送了, 虽然我认为意义不大)

姚新明 <yaoxi...@gmail.com>于2016年7月19日周二 下午8:43写道:
--
您收到此邮件是因为您订阅了Google网上论坛上的“skynet-users”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到skynet-users...@googlegroups.com
要发帖到此群组,请发送电子邮件至skynet...@googlegroups.com
访问此群组:https://groups.google.com/group/skynet-users
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/skynet-users/03498cd1-884d-4b59-acde-5f10e88629b1%40googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

姚新明

unread,
Jul 19, 2016, 10:26:38 PM7/19/16
to skynet-users
我们有些机器是部署在三线机房所以一般有3个网卡。
另外感觉skynet中lua层的开销挺大的,下面是我用perf得到的数据,
系统总cpu占用在18%左右,大部分开销好像在lua,不知道是否正常:

7.67%  skynet         [.] luaV_execute                      
     2.95%  skynet         [.] index2addr                        
     2.30%  skynet         [.] luaD_precall                      
     2.14%  skynet         [.] lua_geti                          
     1.75%  perf           [.] rb_next                           
     1.75%  skynet         [.] luaH_getint                       
     1.64%  [kernel]       [k] memcpy                            
     1.61%  libc-2.17.so   [.] __strstr_sse2                     
     1.58%  skynet         [.] luaH_getshortstr                  
     1.48%  perf           [.] symbols__insert                   
     1.43%  [kernel]       [k] kallsyms_expand_symbol.constprop.1
     1.40%  skynet         [.] lua_seti                          
     1.37%  [kernel]       [k] __schedule                        
     1.30%  [kernel]       [k] module_get_kallsym                
     1.21%  [kernel]       [k] vsnprintf                         
     1.04%  [kernel]       [k] clear_page_c                      
     1.02%  libc-2.17.so   [.] __GI___strcmp_ssse3               
     0.98%  perf           [.] hex2u64                           
     0.93%  [kernel]       [k] string.isra.7                     
     0.91%  [kernel]       [k] _raw_spin_lock_irqsave

我们的业务是io密集型的,从网络层收到udp包后,做一下丢包的处理,根据订阅情况下从网络层发出去。

在 2016年7月19日星期二 UTC+8下午8:43:51,姚新明写道:

云风 Cloud Wu

unread,
Jul 19, 2016, 10:51:24 PM7/19/16
to skynet-users
skynet 本身就是基于 lua 的,在 lua 中开销大正常。因为你也没多少计算的业务。一般重计算的部分,写个 C 库供 lua 调用就能减少 lua 层的负担。

多块网卡的问题,框架本身并没有考虑。如果发送这边的量大,建议试一下我前面说的方案。写个 C 服务直接调用 send 发送。

另外,你说的 600M 是 600MB 还是 600Mb , 如果是 600Mb 的话,我认为远到不了 IO 线程的负载能力。



姚新明 <yaoxi...@gmail.com>于2016年7月20日周三 上午10:26写道:
--
您收到此邮件是因为您订阅了Google网上论坛上的“skynet-users”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到skynet-users...@googlegroups.com
要发帖到此群组,请发送电子邮件至skynet...@googlegroups.com
访问此群组:https://groups.google.com/group/skynet-users
Reply all
Reply to author
Forward
0 new messages