SlideShare a Scribd company logo
基于OpenResty的百万级长连接推送
酷狗音乐 朱德江
doujiang24@gmail.com
大纲
• 实时推送系统设计
• 实施过程与优化经历
特点与挑战
• 并发量大(单连接消耗内存)
• 一般不活跃(维持心跳,4.5min)
• 偶尔很活跃(需要流控)
为什么选择 OpenResty
• 其他的我也不会
• 开发效率快,有多快呢
• 运行效率高,有多高呢
基于OpenResty的百万级长连接推送
• 接入层尽量简单,无状态化
• 长连接维持: 全双工 cosocket + 轻线程
• main uthread: wait on notification, send message
• 2nd uthread: ping-pong, keepalive session in Redis
基于OpenResty的百万级长连接推送
• Sessionid(serverid + worker_id + uid + incr_num)
• (Lua number size, 52bit)
• 共享内存队列(进程间通讯)
• worker 级别的流控
• ngx.semaphore (进程内 “轻线程”间通讯)
基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送
• 200w 连接消耗约 40G 内存(约20k 每连接)
• 维持心跳消耗 7% CPU
• send 100byte message 20w/2s
• CPU: 50%
• Mem: 基本不变
• 得益于各级 buffer,实际上需要动态申请的内存很少
磨刀不误砍柴工
• nginx-systemstap-tools
• https://github.com/openresty/nginx-systemtap-toolkit
• stap++
• https://github.com/openresty/stapxx
• nginx-gdb-utils
• https://github.com/openresty/nginx-gdb-utils
• 前提是:看懂宿主程序代码
• https://github.com/agentzh/code2ebook
内存都去哪了呢
• kernel
• TCP/IP 协议栈
• nginx
• request pool
• LuaJIT
• uthread, cosocket
probe @pfunc(ngx_palloc)
{
if (pid() == target()) {
printf("nnrequest pool size: %dn", ngx_pool_size($pool))
printf("alloc size: %dnn", $size)
print_ubacktrace()
println(luajit_print_backtrace(1))
}
}
https://github.com/doujiang24/stapxx/blob/palloc/samples/ngx-palloc.sxx
基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送
Nginx 内存优化项
• request_pool_size 1k
• lua_socket_buffer_size 1k
• cosocket patch
• https://github.com/openresty/lua-nginx-module/pull/590
• 8k / request
基于OpenResty的百万级长连接推送
LuaJIT 内存优化项
• 避免动态创建对象:
• closure -> shared table + static func
• 尽量共享 table
• lgcstat 查看所有没释放的对象(死的也有)
• lgcpath 只查看活的路径
• GC setpause 90
• gcore -o file pid
• 3k / request
基于OpenResty的百万级长连接推送
CPU: 90%(去掉 resty.redis 里的 concat)
CPU: 40% (去掉多余的 ngx.sleep, sem:wait from 2 to 240)
CPU: 10-18% (如何优化呢)
./samples/lj-lua-stacks.sxx -x $pid
--skip-badvars
--arg time=5
--arg probe='process("$^liblua_path").function("lj_str_new")‘
-D STP_NO_OVERLOAD
CPU: 7% (gc faster & use table instead .. in _gen_req)
CPU 优化项
• ngx.semaphore + shdict list
• lua-resty-redis
未完待续…
• 压榨内存?
• kernel 态 tcp 栈 内存消耗?
• lua-resty-redis-cluster
• ngx-stream-lua
个人小体会
• 测试驱动,嗯,test-nginx 很赞
• 动态追踪真的很赞,激励我去看代码,insight
• curl http://localhost/internal --data-urlencode script@script.lua
• github 开发方式
OVER 
doujiang24@gmail.com

More Related Content

PPTX
Desenvolvimento infantoadolescente liderança Desenvolvimento infantoadolescente
PPTX
O verdadeiro poder - Vicente Falconi
PPT
ESPECIALIDADE DE Caes.ppt
PPTX
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
PDF
Using ngx_lua / lua-nginx-module in pixiv
PPTX
lua & ngx_lua 的介绍与应用
PDF
Lua tech talk
PPTX
Ceph Day Bring Ceph To Enterprise
Desenvolvimento infantoadolescente liderança Desenvolvimento infantoadolescente
O verdadeiro poder - Vicente Falconi
ESPECIALIDADE DE Caes.ppt
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
Using ngx_lua / lua-nginx-module in pixiv
lua & ngx_lua 的介绍与应用
Lua tech talk
Ceph Day Bring Ceph To Enterprise

Viewers also liked (20)

PDF
Using ngx_lua in UPYUN
PDF
Roll Your Own API Management Platform with nginx and Lua
PDF
Nginx Scripting - Extending Nginx Functionalities with Lua
PPTX
Script up your application with Lua! -- RyanE -- OpenWest 2014
PDF
Nginx+lua在阿里巴巴的使用
KEY
淺入淺出 GDB
PDF
Gdb tutorial-handout
PDF
Practical ngx_mruby
PDF
Learn C Programming Language by Using GDB
PPT
Perl在nginx里的应用
PDF
PPTX
應用Ceph技術打造軟體定義儲存新局
PDF
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
PDF
The basics and design of lua table
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PDF
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
PDF
Load balancing in the SRE way
PDF
Microservices & API Gateways
PDF
Making Linux do Hard Real-time
PDF
C/C++调试、跟踪及性能分析工具综述
Using ngx_lua in UPYUN
Roll Your Own API Management Platform with nginx and Lua
Nginx Scripting - Extending Nginx Functionalities with Lua
Script up your application with Lua! -- RyanE -- OpenWest 2014
Nginx+lua在阿里巴巴的使用
淺入淺出 GDB
Gdb tutorial-handout
Practical ngx_mruby
Learn C Programming Language by Using GDB
Perl在nginx里的应用
應用Ceph技術打造軟體定義儲存新局
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
The basics and design of lua table
高性能Web服务器Nginx及相关新技术的应用实践
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
Load balancing in the SRE way
Microservices & API Gateways
Making Linux do Hard Real-time
C/C++调试、跟踪及性能分析工具综述
Ad

More from OpenRestyCon (6)

PDF
Nginx+Lua在京东商品详情页的大规模应用
PDF
Developing OpenResty Framework
PDF
Using ngx_lua in upyun 2
PDF
Nginx+lua+py构建高性能处理服务
PDF
Be a microservices hero
PDF
OpenRestyCon 2015
Nginx+Lua在京东商品详情页的大规模应用
Developing OpenResty Framework
Using ngx_lua in upyun 2
Nginx+lua+py构建高性能处理服务
Be a microservices hero
OpenRestyCon 2015
Ad

基于OpenResty的百万级长连接推送