skyent中socket中使用共享指针的方式是否有价值?

354 views
Skip to first unread message

姚新明

unread,
Nov 10, 2014, 8:39:53 PM11/10/14
to skynet...@googlegroups.com
因为有大量的数据需要广播,主要是音视频数据,目前采用的是将数据拷贝的方式,
广播的时候每个客户端都拷贝一份数据,然后通过socket发送,感觉这种模式内存
拷贝有点多,会影响性能(目前还没做性能测试),另外想的方案是共享这个数据的指针,
做个计数器,这个需要修改socket server,不知道是否还有更好的方案

云风

unread,
Nov 10, 2014, 9:52:46 PM11/10/14
to skynet...@googlegroups.com
你看错了.

skynet 的 socket 发送时并没有拷贝数据块, 而仅仅是传递了由 malloc 分配的指针. 在发送完毕后, 发送线程来 free 这个指针.


--
您收到此邮件是因为您订阅了Google网上论坛中的“skynet-users”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到skynet-users...@googlegroups.com
要发帖到此论坛,请发送电子邮件至skynet...@googlegroups.com
通过http://groups.google.com/group/skynet-users访问此论坛。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/skynet-users/9fec9272-d42c-4eca-a62b-3642d250682a%40googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout



--

姚新明

unread,
Nov 10, 2014, 10:08:35 PM11/10/14
to skynet...@googlegroups.com
在socket server中 我看到有   FREE(request->buffer),我再仔细看看,如果发送方释放的话,在应用层做个共享指针


在 2014年11月11日星期二UTC+8上午10时52分46秒,云风写道:
你看错了.

skynet 的 socket 发送时并没有拷贝数据块, 而仅仅是传递了由 malloc 分配的指针. 在发送完毕后, 发送线程来 free 这个指针.

在 2014年11月11日 上午9:39,姚新明 <yaoxi...@gmail.com>写道:
因为有大量的数据需要广播,主要是音视频数据,目前采用的是将数据拷贝的方式,
广播的时候每个客户端都拷贝一份数据,然后通过socket发送,感觉这种模式内存
拷贝有点多,会影响性能(目前还没做性能测试),另外想的方案是共享这个数据的指针,
做个计数器,这个需要修改socket server,不知道是否还有更好的方案

--
您收到此邮件是因为您订阅了Google网上论坛中的“skynet-users”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到skynet-users+unsubscribe@googlegroups.com

要发帖到此论坛,请发送电子邮件至skynet...@googlegroups.com
通过http://groups.google.com/group/skynet-users访问此论坛。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/skynet-users/9fec9272-d42c-4eca-a62b-3642d250682a%40googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

云风

unread,
Nov 10, 2014, 10:46:29 PM11/10/14
to skynet...@googlegroups.com
目前严格要求产生数据的应用层分配和填充数据(填充完毕就不能对数据再做任何读写操作), 网络发送数据的地方释放. 所以没有必要增加引用计数等方式来共享数据块.

--
您收到此邮件是因为您订阅了Google网上论坛中的“skynet-users”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到skynet-users...@googlegroups.com
要发帖到此论坛,请发送电子邮件至skynet...@googlegroups.com
通过http://groups.google.com/group/skynet-users访问此论坛。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/skynet-users/7f2c0d75-cecc-4c07-98da-08840af6b1ce%40googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout



--

云风

unread,
Nov 10, 2014, 10:57:30 PM11/10/14
to skynet...@googlegroups.com
重新看了一下你的问题. 你是希望把同一份数据发送给很多不同的客户端?
这一点, skynet 并没有做优化. 暂时也不打算在底层做这种优化. (会增加很多复杂度)
因为如果是纯粹的数据复制, 内存带宽要远大于网络带宽. 如果做好流量控制的话, 单位时间的内存占用量也应该和网卡吞吐量在一个数量级.

如果实在觉得优化是必要的, 我建议你从内存分配释放这点入手. 让 FREE(request->buffer) 并不真正释放内存, 而是把引用减少.
我可以考虑把这个位置的函数调用改成可配置的, 而不是写死的宏.


在 2014年11月11日 上午11:08,姚新明 <yaoxi...@gmail.com>写道:

--
您收到此邮件是因为您订阅了Google网上论坛中的“skynet-users”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到skynet-users...@googlegroups.com
要发帖到此论坛,请发送电子邮件至skynet...@googlegroups.com
通过http://groups.google.com/group/skynet-users访问此论坛。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/skynet-users/7f2c0d75-cecc-4c07-98da-08840af6b1ce%40googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout



--

姚新明

unread,
Nov 11, 2014, 12:30:19 AM11/11/14
to skynet...@googlegroups.com
是准备发送到不同的客户端,希望FREE能做成可以配置的,这样比较灵活
再请教一个问题,现在socket server是单线程的,如果使用多线程是否能提高网络这块的性能,我印象中erlang内核
中网络这块好像是多线程来处理的

在 2014年11月11日星期二UTC+8上午11时57分30秒,云风写道:

云风

unread,
Nov 11, 2014, 1:03:40 AM11/11/14
to skynet...@googlegroups.com
如果只有一块网卡,我不认为多线程能提高网络 IO 的性能, 反而会增加不必要的复杂度.

我在 dev 分支上, 在保证最大限度的向前兼容的前提下, 做了一些修改.


可以通过调用 socket_server_userobject 来设置一组 api 管理自定义的发送对象.需要实现

buffer : 获取真正的数据块地址
size: 获取数据块长度
free: 释放数据块的函数指针.

这样, 在 send 那边, 只需要传入自定义的对象指针, 并把 sz 设为 -1 就可以工作了.

当然要用起来(比如在 lua 中), 还需要编写对应的额外 lua  库.

你可以用一下, 根据实际使用情况再来看是否要对这些 api 做修改.


--
您收到此邮件是因为您订阅了Google网上论坛中的“skynet-users”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到skynet-users...@googlegroups.com
要发帖到此论坛,请发送电子邮件至skynet...@googlegroups.com
通过http://groups.google.com/group/skynet-users访问此论坛。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/skynet-users/b6c5e6fa-3449-414b-a30b-58f3883ee7c5%40googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout



--

云风 Cloud Wu

unread,
Jun 8, 2017, 8:15:45 AM6/8/17
to skynet...@googlegroups.com, yaoxi...@gmail.com

姚新明 <yaoxi...@gmail.com>于2014年11月11日周二 下午1:30写道:
是准备发送到不同的客户端,希望FREE能做成可以配置的,这样比较灵活
再请教一个问题,现在socket server是单线程的,如果使用多线程是否能提高网络这块的性能,我印象中erlang内核
中网络这块好像是多线程来处理的


关于单线程处理 socket  的问题,看一下 https://github.com/cloudwu/skynet/issues/646 这处讨论。

我今天尝试着了一点优化,放在 directwrite 分支上。新机制会尝试在调用 socket_server_send 或 socket_server_udp_send 时,先检查一下能不能直接发送,如果可以,就直接发送走,而不需再投递到 socket thread 。

如果这步 api 调用失败,会开启写事件监听,并把待发 buffer 放在 struct socket 结构里。当 socket thread 的写事件触发发送 buffer 时,会先检查有没有 direct write 发送失败的 buffer ,若有,会将其加在链表头部。


@姚新明 记得你用 skynet 做流媒体广播,看看是否它能帮你的服务器提高网络吞吐能力。


姚新明

unread,
Oct 17, 2017, 1:38:05 AM10/17/17
to skynet-users
好的,我们新版本已经将新版本merge过去了,后续会做下性能测试。
另外我们考虑网络层用F-Stack来试试看(https://github.com/F-Stack/f-stack),如果方便的话帮忙简单看下有没技术风险和需要注意的地方,谢谢。

在 2017年6月8日星期四 UTC+8下午8:15:45,云风写道:
Reply all
Reply to author
Forward
0 new messages