Lua 在 Nginx 中的应用

peterzyliu

贡献于2015-04-27

字数:0 关键词: Web服务器 Lua Nginx

  Application of Lua in Nginx   Lua 在 Nginx 中的应用   ☺agentzh@gmail.com☺ 章亦春 (agentzh)     2015.04     ☺ No "callback hell". ☺ 100% nonblocking IO   没有“回调地狱”。 100% 非阻塞I/O.     ☺ openresty.org     ☺ qa.openresty.org   OpenResty 测试集群        $ ./dispatcher ­r ­t 170 ­a 'linux x86_64' ngx_echo ngx_lua    Requires at least 5 machines.    bucket 1: tl­ngx_lua (264 min)    bucket 2: twv­ngx_lua tw­ngx_lua trv­ngx_echo th­ngx_echo (167 min)    bucket 3: trv­ngx_lua th­ngx_lua t­ngx_lua tv­ngx_echo tr­ngx_echo (162 min)    bucket 4: tv­ngx_lua tl­ngx_echo to­ngx_lua thv­ngx_echo t­ngx_echo (145 min)    bucket 5: thv­ngx_lua tr­ngx_lua twv­ngx_echo tw­ngx_echo to­ngx_echo (90 min)    ...     ☺ Lua SSL ☺ Lua CDN ☺ Lua WAF (Lua Web 防火墙)     ☺ Light threads   轻量级线程        local thread_A, err =            ngx.thread.spawn(func1)      ­­ thread_A keeps running asynchronously    ­­ in the background of the current    ­­ "light thread".        local ok, res1, res2 =                ngx.thread.wait(thread_A, thread_B)      local ok, err = ngx.thread.kill(thread_A)     ☺ lua­resty­websocket   WebSocket 服务器和客户端        local server = require "resty.websocket.server"      local wb, err = server:new{        timeout = 5000,  ­­ in milliseconds        max_payload_len = 65535,    }      local data, typ, err = wb:recv_frame()      local bytes, err = wb:send_text("Hello world")     ☺ full­duplex cosockets   全双工的基于协程的套接字     ☺ SSL/TLS cosocket          local sock = ngx.socket.tcp()    local ok, err = sock:connect("www.cloudflare.com",                                 443)      ok, err = sock:sslhandshake(        false,  ­­ disable SSL session        "www.cloudflare.com",  ­­ SNI name        true  ­­ verify everything    )     ☺ ssl_certificate_by_lua     纯 Lua 动态服务 SSL 证书和私钥      ssl_certificate_by_lua '        local ssl = require "ngx.ssl"        local cert_chain, priv_key = my_load_data()        assert(ssl.set_der_cert(cert_chain))        assert(ssl.set_der_priv_key(priv_key))    ';     ☺ ssl_balancer_by_lua   纯 Lua 编写 Nginx 全动态负载均衡器        upstream {        server 0.0.0.0;        balancer_by_lua '            local balancer = require "ngx.balancer"            local host, port = my_load_backend_addr()            assert(balancer.set_cur_peer(host, port))        ';    }     ☺ nginx­systemtap­toolkit   基于 Systemtap 的 Nginx 工具箱     ☺ stapxx (stap++)   Systemtap 加上一点宏魔法……     ☺ How CPU time is spent inside LuaJIT   CPU 时间在 LuaJIT 内部是如何分布的        $ lj­vm­states.sxx ­x 5521 ­­arg time=60    Start tracing 5521 (/usr/local/nginx­waf/sbin/nginx­waf)    Please wait for 60 seconds...      Observed 1203 Lua­running samples and ignored 49 unrelated samples.    Compiled: 64% (779 samples)    C Code (by interpreted Lua): 14% (172 samples)    Interpreted: 13% (158 samples)    Garbage Collector (compiled): 3% (48 samples)    Garbage Collector (not compiled): 3% (42 samples)    Trace exiting: 0% (4 samples)   ☺ When an nginx worker's CPU is too high...   当 nginx worker 进程的 CPU 太高时……      # assuming one nginx worker process has the pid 19647.    $ ngx­rps.sxx ­x 19647    WARNING: Tracing process 19647.    Hit Ctrl­C to end.    [1376939543] 300 req/sec    [1376939544] 235 req/sec    [1376939545] 235 req/sec    [1376939546] 166 req/sec    [1376939547] 238 req/sec    [1376939548] 234 req/sec    ^C        $ ./sample­bt ­p 19647 ­t 20 ­u > a.bt    WARNING: Tracing 19647 (/opt/nginx/sbin/nginx) in user­space only...    WARNING: Time's up. Quitting now...(it may take a while)        # using Brendan Gregg's flame graph tools:    $ stackcollapse­stap.pl a.bt > a.cbt    $ flamegraph.pl a.cbt > a.svg        # assuming the nginx worker process pid is 19647:    $ lj­lua­stacks.sxx ­­arg time=20 ­­skip­badvars ­x 19647 > a.bt    Start tracing 19647 (/opt/nginx/sbin/nginx)    Please wait for 20 seconds        # using Brendan Gregg's flame graph tools:    $ stackcollapse­stap.pl a.bt > a.cbt    $ flamegraph.pl a.cbt > a.svg     ☺ When an nginx worker's CPU is low and the throughput is low...   当 nginx worker 进程的 CPU 很低, 同时吞吐量上不去的时候……     ☺ off­CPU flame graphs from the sample­bt­off­cpu tool     ☺ nginx­gdb­utils   基于GDB 的Nginx 工具箱        (gdb) lbt    C:ngx_http_lua_socket_tcp_receive    @.../lib/resty/mysql.lua:191    @.../lib/resty/mysql.lua:530    content_by_lua:10        (gdb) lbt full    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)    ...        (gdb) lgc    The current memory size (allocated by GC): 898960 bytes        (gdb) lgcstat    15172 str        objects: max=2956, avg = 51, min=18, sum=779126     987 upval      objects: max=24, avg = 24, min=24, sum=23688     104 thread     objects: max=1648, avg = 1622, min=528, sum=168784     431 proto      objects: max=226274, avg = 2234, min=78, sum=963196     952 func       objects: max=144, avg = 30, min=20, sum=28900     446 trace      objects: max=23400, avg = 1857, min=160, sum=828604    2965 cdata      objects: max=4112, avg = 17, min=12, sum=51576    18961 tab        objects: max=24608, avg = 207, min=32, sum=3943256       9 udata      objects: max=176095, avg = 39313, min=32, sum=353822     ☺  Any questions? ☺   欢迎提问 A

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档