H2o: mruby์—์„œ ์ง€์—ฐ(์ˆ˜๋ฉด, Thread.sleep)์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 05์›” 02์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: h2o/h2o

๋‚˜๋Š” http_request๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WordPress์—์„œ ์บ์‹œ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” mruby ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž ์ž๊ธฐ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ณ  ๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— PHP๊ฐ€ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

mruby๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ h2o์—์„œ ๋ช‡ ์ดˆ ๋™์•ˆ ์ž ์„ ์ž˜ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ค๋ฅ˜:
[lib/handler/fastcgi.c] in request:/index.php/tag/science:connection failed:failed to connect to host

์ฝ”๋“œ:

if request_is_from_self and links_file_exist and req_is_get
    links = `php #{links_filepath}`

    for link in links.split(' ') do
        req = http_request(link)
        _, _, _ = req.join
    end
end
enhancement mruby

๋ชจ๋“  6 ๋Œ“๊ธ€

์•ˆ๋…• @taosx
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋”ฐ๋ผ๊ฐˆ ์ˆ˜์—†๋Š” ์ •๋ง๋กœ php์ธ์ง€ ๋‹ค์†Œ ์˜์‹ฌ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ fastcgi๋ฅผ ์‹คํ–‰ํ•˜๋Š” h2o์˜ ๊ณ ์œ ํ•œ ์ธ์Šคํ„ด์Šค์— http ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ์‹œ ์ค‘์ง€๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‚ด๊ฐ€ ์ฝ์€ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ์š”์ฒญ์ด ๋ณ‘๋ ฌ๋กœ ์ง„ํ–‰๋˜๋ฏ€๋กœ ๋ชจ๋“  ์š”์ฒญ์ด ๋ฐœ์ƒํ•œ ํ›„์—๋งŒ ๊ฐ€์ž…์„ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ฐ™์€ ๊ฒƒ์„ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

links.split(' ').map{|l| http_request }.to_a.map{|r| r.join}

๋” ์ž์„ธํ•œ ์˜ค๋ฅ˜ ์„ค๋ช…์„ ๊ฒŒ์‹œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ํ•ญ์ƒ ๋™์ผํ•œ ๋ช‡ ๊ฐœ์˜ ๋งํฌ๊ฐ€ ์žˆ๊ณ  ๋‹ค์†Œ ์ •์ ์ด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ์—์„œ ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ฝ”๋“œ๊ฐ€ http_request์— ๋Œ€ํ•œ ์ธ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
links.split(' ').map{|l| http_request(l) }.map{|r| r.join}
๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์œ„์— ๊ฒŒ์‹œํ•œ ์ฝ”๋“œ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ๋–จ์–ด์ง€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” opcache๋ฅผ PHP์— ์„ค์น˜ํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•˜์—ฌ ์†”๋ฃจ์…˜์„ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉฐ ์ด์ œ ๋ชจ๋“  ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ฅ˜ ์—†์ด 27์ดˆ์—์„œ 3.1์ดˆ๋กœ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 4์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ 2๋ถ„๋งˆ๋‹ค ํŽ˜์ด์ง€๋ฅผ ์บ์‹œํ•˜๊ณ  ์ตœ๋Œ€ ์„ค์ •์—์„œ gzip๊ณผ brottli๋กœ ์‚ฌ์ „ ์••์ถ•ํ•˜๊ณ  ์บ์‹œ์—์„œ ์ œ๊ณตํ•˜๋Š” h2o๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WordPress ์‚ฌ์ดํŠธ์˜ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ h2o๋ฅผ ์‚ฌ๋ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. h2o์— ๊ธฐ์—ฌํ•œ ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!!

์•ž์œผ๋กœ ๋‚˜๋Š” openresty์™€ ๊ฐ™์ด h2o๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ h2o์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์Šคํฌ๋ฆฝํŒ… ๊ธฐ๋Šฅ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.:D

@taosx ์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค: .to_a

links.split(' ').map{|l| http_request }.to_a.map{|r| r.join}

๊ทธ๋ƒฅ ํ˜ธ๊ธฐ์‹ฌ์—, ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๊นŒ / ๋งํฌ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ?

@yannick ๋‹ค์‹œ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์ธ์ˆ˜(l)๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด http_request๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์†๋„๋Š” 3.06์ดˆ๋กœ ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค:D, ์บ์‹œ๋ฅผ ์›œ์—…ํ•  ๋•Œ ๋•Œ๋•Œ๋กœ 2.9+.
๋งํฌ ๋ฐฐ์—ด์—๋Š” 41๊ฐœ์˜ ์š”์†Œ(aws ec2 t2.micro)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ฒŒ์‹œ๋ฌผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ฒŒ์‹œ๋ฌผ ์ž์ฒด์—์„œ 1๊ฐœ์˜ ๋งํฌ + ์ถ”๊ฐ€๋œ ํƒœ๊ทธ์—์„œ ~5๊ฐœ์˜ ๋งํฌ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค...
๋‚˜๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ mruby๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ๋ฏธ๋ž˜์—๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

wp์— ๋Œ€ํ•œ ์—ญ ํ”„๋ก์‹œ ์บ์‹œ๋กœ mruby์™€ ํ•จ๊ป˜ h2o๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Links = php #{links_filepath} ํ†ตํ•ด PHP๋กœ ์‰˜ ์•„์›ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๋งค์šฐ ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ ์‹œ๊ฐ„์„ ์ œ๊ฑฐ ํ–ˆ์Šต๋‹ˆ๊นŒ?
h2o์˜ ๊ฒฝ์šฐ t2.micro๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ํ•ด๋‹น ์‹œ์Šคํ…œ์—์„œ php ํ•ญ๋ชฉ๋„ ์‹คํ–‰ํ•˜๋ฉด ๋‹จ์ผ CPU๋ฅผ ๋†“๊ณ  ๊ฒฝ์Ÿํ•˜๊ณ  ์„ฑ๋Šฅ์€ ๋”์šฑ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ ์–ด๋„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด c4.large ๋˜๋Š” c4.xlarge์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ mruby๋ฅผ ํ†ตํ•œ ์บ์‹ฑ์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ์—ฌ์ „ํžˆ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๊ณง ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•จ, https://github.com/h2o/h2o/pull/1152 ์ฐธ์กฐ).

ํฅ๋ฏธ๋กœ์šด ํ† ๋ก ์ž…๋‹ˆ๋‹ค!

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•(์˜ˆ: mruby๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ ๊ตฌํ˜„)์„ ์ œ์™ธํ•˜๊ณ ๋Š” mruby ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ ˆ์ „ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ๋ง์•„์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰