AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

Lua 在 Nginx 中的应用 by 章亦春@淘宝

发布者 dber
发布于 1450227783272  浏览 8854 关键词 Nginx 
分享到

第1页



ApplicationofLuainNginx 

Lua在Nginx中的应用 

☺agentzh@gmail.com☺

章亦春(agentzh)













2015.04



第8页

 ☺No"callbackhell".

☺100%nonblockingIO 

没有“回调地狱”。 100%非阻塞I/O. 



第13页



☺openresty.org 



第14页

 ☺qa.openresty.org



OpenResty测试集群 



第16页

 $./dispatcher­r­t170­a'linuxx86_64'ngx_echongx_lua Requiresatleast5machines. bucket1:tl­ngx_lua(264min) bucket2:twv­ngx_luatw­ngx_luatrv­ngx_echoth­ngx_echo(167min) bucket3:trv­ngx_luath­ngx_luat­ngx_luatv­ngx_echotr­ngx_echo(162min) bucket4:tv­ngx_luatl­ngx_echoto­ngx_luathv­ngx_echot­ngx_echo(145min) bucket5:thv­ngx_luatr­ngx_luatwv­ngx_echotw­ngx_echoto­ngx_echo(90min) ... 



第18页



☺LuaSSL ☺LuaCDN ☺LuaWAF(LuaWeb防火墙) 



第19页



☺Lightthreads 

轻量级线程 



第21页

 localthread_A,err= ngx.thread.spawn(func1)  ­­thread_Akeepsrunningasynchronously ­­inthebackgroundofthecurrent ­­"lightthread". 



第22页

 localok,res1,res2= ngx.thread.wait(thread_A,thread_B)



第23页

 localok,err=ngx.thread.kill(thread_A) 



第24页



☺lua­resty­websocket 

WebSocket服务器和客户端 



第25页

 localserver=require"resty.websocket.server"  localwb,err=server:new{ timeout=5000,­­inmilliseconds max_payload_len=65535, }  localdata,typ,err=wb:recv_frame()  localbytes,err=wb:send_text("Helloworld") 



第26页



☺full­duplexcosockets 

全双工的基于协程的套接字





第27页

 ☺SSL/TLScosocket







第28页

 localsock=ngx.socket.tcp() localok,err=sock:connect("www.cloudflare.com", 443)  ok,err=sock:sslhandshake( false,­­disableSSLsession "www.cloudflare.com",­­SNIname true­­verifyeverything ) 



第29页

 ☺ssl_certificate_by_lua



 纯Lua动态服务SSL证书和私钥



第31页

 ssl_certificate_by_lua' localssl=require"ngx.ssl" localcert_chain,priv_key=my_load_data() assert(ssl.set_der_cert(cert_chain)) assert(ssl.set_der_priv_key(priv_key)) '; 



第33页

 ☺ssl_balancer_by_lua



纯Lua编写Nginx全动态负载均衡器 



第34页

 upstream{ server0.0.0.0; balancer_by_lua' localbalancer=require"ngx.balancer" localhost,port=my_load_backend_addr() assert(balancer.set_cur_peer(host,port)) '; } 



第35页

 ☺nginx­systemtap­toolkit



基于Systemtap的Nginx工具箱 



第37页



☺stapxx(stap++) 

Systemtap加上一点宏魔法…… 



第39页



☺HowCPUtimeisspentinsideLuaJIT 

CPU时间在LuaJIT内部是如何分布的 



第40页

 $lj­vm­states.sxx­x5521­­argtime=60 Starttracing5521(/usr/local/nginx­waf/sbin/nginx­waf) Pleasewaitfor60seconds...  Observed1203Lua­runningsamplesandignored49unrelatedsamples. Compiled:64%(779samples) CCode(byinterpretedLua):14%(172samples) Interpreted:13%(158samples) GarbageCollector(compiled):3%(48samples) GarbageCollector(notcompiled):3%(42samples) Traceexiting:0%(4samples) 



第41页

☺Whenannginxworker'sCPUistoohigh... 

当nginxworker进程的CPU太高时……



第43页

 #assumingonenginxworkerprocesshasthepid19647. $ngx­rps.sxx­x19647 WARNING:Tracingprocess19647. HitCtrl­Ctoend. [1376939543]300req/sec [1376939544]235req/sec [1376939545]235req/sec [1376939546]166req/sec [1376939547]238req/sec [1376939548]234req/sec ^C 



第44页

 $./sample­bt­p19647­t20­u>a.bt WARNING:Tracing19647(/opt/nginx/sbin/nginx)inuser­spaceonly... WARNING:Time'sup.Quittingnow...(itmaytakeawhile) 



第45页

 #usingBrendanGregg'sflamegraphtools: $stackcollapse­stap.pla.bt>a.cbt $flamegraph.pla.cbt>a.svg 



第47页

 #assumingthenginxworkerprocesspidis19647: $lj­lua­stacks.sxx­­argtime=20­­skip­badvars­x19647>a.bt Starttracing19647(/opt/nginx/sbin/nginx) Pleasewaitfor20seconds 



第48页

 #usingBrendanGregg'sflamegraphtools: $stackcollapse­stap.pla.bt>a.cbt $flamegraph.pla.cbt>a.svg 



第50页



☺Whenannginxworker'sCPUislow andthethroughputislow...



当nginxworker进程的CPU很低, 同时吞吐量上不去的时候……





第52页



☺off­CPUflamegraphs fromthesample­bt­off­cputool 



第56页

 ☺nginx­gdb­utils



基于GDB的Nginx工具箱 



第58页

 (gdb)lbt C:ngx_http_lua_socket_tcp_receive @.../lib/resty/mysql.lua:191 @.../lib/resty/mysql.lua:530 content_by_lua:10 



第59页

 (gdb)lbtfull C:ngx_http_lua_socket_tcp_receive @.../lib/resty/mysql.lua:191 local"self": table(0x40f181a8) local"sock": table(0x40f181b0) @.../lib/resty/mysql.lua:530 local"self": table(0x40f18148) local"opts": table(0x40f18150) ... 



第60页

 (gdb)lgc Thecurrentmemorysize(allocatedbyGC):898960bytes 



第61页

 (gdb)lgcstat 15172strobjects:max=2956,avg=51,min=18,sum=779126 987upvalobjects:max=24,avg=24,min=24,sum=23688 104threadobjects:max=1648,avg=1622,min=528,sum=168784 431protoobjects:max=226274,avg=2234,min=78,sum=963196 952funcobjects:max=144,avg=30,min=20,sum=28900 446traceobjects:max=23400,avg=1857,min=160,sum=828604 2965cdataobjects:max=4112,avg=17,min=12,sum=51576 18961tabobjects:max=24608,avg=207,min=32,sum=3943256 9udataobjects:max=176095,avg=39313,min=32,sum=353822 



第62页

 ☺Anyquestions?☺



欢迎提问



第63页

A



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。