V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  dndx  ›  全部回复第 61 页 / 共 76 页
回复总数  1517
1 ... 57  58  59  60  61  62  63  64  65  66 ... 76  
2013-01-04 10:37:33 +08:00
回复了 wuxiaolin 创建的主题 PHP \x1D\x04\x00\x08\x00\x00\x00 这种是什么数据格式
这个应该是十六进制吧,\x1D 就是0x1D
2013-01-04 07:27:45 +08:00
回复了 Geeker 创建的主题 问与答 大学生怎么通过技术赚钱?
@Air_Mu 美国大学的 On Campus Programming Work 都是按小时收费的。
2013-01-02 16:33:52 +08:00
回复了 clowwindy 创建的主题 Node.js node.js 的内存管理问题
@clowwindy 反复malloc/free不是问题所在,因为malloc和free的速度相当快。

真正的问题在libuv上,因为libuv在远端有数据时会不停的申请内存读取,而写到客户端的速度相对较慢,导致writing queue里大量请求堆积。而在写入操作完成后,libuv不会立即调用callback,而是将callback append到了一个叫做write_completed_queue 的 queue里等待机会调用,参考:

https://github.com/joyent/libuv/blob/master/src/unix/stream.c#L678-L683

而根据libuv的工作原理,write callback负责free申请的buffer,如果callback得不到机会调用,buffer就无法被真正的释放。

uv__write_callbacks,这个函数会empty queue并且call每个callback:

https://github.com/joyent/libuv/blob/master/src/unix/stream.c#L846-L858

问题是这个函数只有在EPOLL POLLOUT的时候才会被call,而在libuv疯狂接收YouTube视频的时候,POLLOUT的机会是很少的。

shadowsocks-libuv最早的时候有跟你描述的一模一样的问题,后来发现是请求堆积后在内部维护了一个计数器,限制writing queue的长度,这也就是config.h中的MAX_PENDING_PER_CONN的作用,否则以美帝的网速,内存很快就被申请爆了。
1 ... 57  58  59  60  61  62  63  64  65  66 ... 76  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4185 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 34ms · UTC 05:29 · PVG 13:29 · LAX 22:29 · JFK 01:29
Developed with CodeLauncher
♥ Do have faith in what you're doing.