2012/8/19 Alvin Jiang wrote:
> 我正在做一个文件共享和多人群聊系统,所有聊天时发送的文件都会存在服务器上。
> 群聊时,当某个人上载一个大文件时,需要将该文件的上传进度广播到所有参与聊天的人的客户端界面上。
> 目前我准备在nginx-upload-progress-module模块上改进,每隔固定的时间(比如1秒)将当前的上传进度通过另外一个消息服务器(基于nginx_push_stream_module实现的)广播给其余的人。
> 该消息服务器和文件上传服务器并不是同一个,而且向该消息服务器发送消息必须采用POST或者websocket。
> 一旦进度消息发出,就不再关心其返回结果;或者当前一个进度消息未返回时就不再发送下一条进度消息。
> 这样我需要丢弃进度消息的响应,不把该消息的响应发送会客户端。
> 我看了您写的echo_nginx_module,但没有和我这个需求相关的东西。
> 请教,这个需求该怎么实现呢?
我的 ngx_srcache 模块中的 srcache_store 指令发起的子请求的响应是被直接忽略的,见
http://wiki.nginx.org/HttpSRCacheModule
你可以参考这个模块的实现。不过对于你的需求本身而言,我觉得或许 ngx_lua 模块更合适一些?见
http://wiki.nginx.org/HttpLuaModule
我同时抄送给了 openresty 邮件列表:https://groups.google.com/group/openresty 那里的
Nginx/OpenResty 用户和开发者或许可以给你更多的意见和建议 :)
Best regards,
-agentzh
Hello!
2013/4/11 li.huang:
> 在我的/sub中连续store多个不同的memcached的方式是不是最有效率的?
我其实并不太明白为什么你要向多个 memcached 写入 :)
> set_keepalive和close哪个效率更好?如果是set_keepalive的话,超时和长连接数量的值应该根据什么设置才能有最好的性能?
>
应当总是使用 set_keepalive,同时连接池的大小应当设置得足够大。否则短连接很容易将你系统的临时端口用尽。
另外,在进行压力测试时,应当禁掉 DDEBUG 和 --with-debug,同时使用 warn 以上的 error_log
日志过滤级别。否则你的 nginx
都忙着刷不带缓冲的错误日志了。另外,你也应设置访问日志的缓冲区或者完全禁掉访问日志(如果你不需要的话),见
http://wiki.nginx.org/HttpLogModule#access_log
最后,如果你的 nginx 进程的 CPU 占用比较高,可以使用“火焰图”(flamegraph)对内部的执行热点进行分析:
https://github.com/agentzh/nginx-systemtap-toolkit#ngx-sample-bt
Regards,
-agentzh
On Saturday, April 13, 2013 2:05:08 AM UTC+8, agentzh wrote:Hello!
2013/4/11 li.huang:
> 在我的/sub中连续store多个不同的memcached的方式是不是最有效率的?
我其实并不太明白为什么你要向多个 memcached 写入 :)我们这个系统大概有这么多的节点,需要缓存同步,50个是下限。
> set_keepalive和close哪个效率更好?如果是set_keepalive的话,超时和长连接数量的值应该根据什么设置才能有最好的性能?
>
应当总是使用 set_keepalive,同时连接池的大小应当设置得足够大。否则短连接很容易将你系统的临时端口用尽。
Hello!
2013/4/11 黄力:
> 本地memcached连接统计
> 未完全关闭
> root@debian:/etc/nginx/proxy# ss -t -a | grep 122.225.36.179:11216 | grep -c
> TIME
> 26095
> 连接中
> root@debian:/etc/nginx/proxy# ss -t -a | grep 122.225.36.179:11216 | grep -c
> EST
> 0
> 总的来说,对外网memcached的连接数量大于TIME-WAIT数量,对本地memcached的TIME-WAIT数量远远大于连接数量。
貌似你的连接池未能生效,很可能是因为有连接超时等错误出现。连接上的错误会导致连接被强行关闭。
Hello!
2013/4/13 黄力li.huang:
>> 貌似你的连接池未能生效,很可能是因为有连接超时等错误出现。连接上的错误会导致连接被强行关闭。
>
> 现在发现对于外网memcached存在不少connect timeout和set
> timeout,
请提供原始的错误日志,而不是自然语言描述,因为后者丢失了很多重要信息 :)
另外,你从运行 nginx 的机器测试过你的外网 memcached
的性能极限么?特别是整体的吞吐量上限。当超过这个服务的负载能力时,自然会看到很多超时。同时由于外网的网络不确定因素多,出现超时的机会本来就大,仔细把你的外网带宽耗尽。
> 我现在已经memc:set_timeout(600000)
> ,十分钟,但是好像不到一分钟就timeout了,有没有什么好的解决办法?
1. 你说超时设置提前触发,你的根据是什么?
2. 使用过大的超时是应绝对避免的,因这这个时间会加进你的请求服务时间中去。
3. 我觉得像这种涉及外网的缓存同步操作还是放在 nginx 外部来做更合适一些。比如换用 redis 作为缓存存储,并使用它的
master-slave replication 机制自己进行数据同步。
> 我现在已经把不同机器的set请求放到corountine里了,见附件,不过这样改的话,
使用 Lua 标准的 coroutine API 并不能让串行请求并行化,只是徒增额外的开销罢了。或许你这里需要的是 ngx.thread.* API?
http://wiki.nginx.org/HttpLuaModule#ngx.thread.spawn
提高后端访问的并发度可以减少单个请求的响应延时,但不会增加系统整体的吞吐量(事实上,整体吞吐量反而会略有下降)。
> 更容易把网络带宽耗尽吧?那时timeout就更多了。
你为什么不直接对你的网络带宽本身进行测试和计量?猜测是得不出结论的 :)
Best regards,
-agentzh
Best regards,
-agentzh
On Saturday, April 13, 2013 11:51:41 PM UTC+8, agentzh wrote:Hello!
2013/4/13 黄力li.huang:
>> 貌似你的连接池未能生效,很可能是因为有连接超时等错误出现。连接上的错误会导致连接被强行关闭。
>
> 现在发现对于外网memcached存在不少connect timeout和set
> timeout,
请提供原始的错误日志,而不是自然语言描述,因为后者丢失了很多重要信息 :)好的,今天在家无法登陆server,明天去公司拷贝上来。春哥,这里悄悄的问一句 :CF哪些模块用了lua?
Regards,
-agentzh
Regards,
-agentzh
Regards,
-agentzh
Regards,
-agentzh
Regards,
-agentzh
Regards,
-agentzh