๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋„คํŠธ์›Œํฌ

๋‹ค์ค‘ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

๊ธฐ์กด์˜ per process, pre-fork, worker ๋‹ค์ค‘ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

fork ๋ฐฉ์‹ (per process)

  • ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ์ž์‹ process๊ฐ€ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž ์š”์ฒญ(์š”์ฒญ 1, ์š”์ฒญ 2, ์š”์ฒญ 3..)์ด ๋“ค์–ด์˜ค๋ฉด ๋ถ€๋ชจ process์—์„œ ์ž์‹ process๋ฅผ fork(์ž์‹ 1, ์ž์‹ 2, ์ž์‹ 3...)ํ•ด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  • ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œ ํ›„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์—ฌ๊ธฐ์„œ์˜ ๋ฆฌ์†Œ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ

pre-fork ๋ฐฉ์‹

  • ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ผ์ •๋Ÿ‰ ๋ฏธ๋ฆฌ forkํ•˜๋Š” ๋ฐฉ์‹
  • ํ•˜๋‚˜์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง
    • ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ ๋ฅผ ์•ˆ ํ•˜๋ฏ€๋กœ ๋…๋ฆฝ์ ์ด๊ณ  ์•ˆ์ •์ 
  • ์ผ๋ฐ˜์ ์œผ๋กœ Single CPU, Dual CPU์—์„œ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.
  • ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ตœ๋Œ€ 1024๊ฐœ๊นŒ์ง€ ๊ฐ€๋Šฅ

worker ๋ฐฉ์‹

  • worker๋Š” "์ผ์„ ํ•˜๋Š” ์‚ฌ๋žŒ", "์ž‘์—…์ž"๋ฅผ ์˜๋ฏธ
    • master-slave, primary-secondary(replica) ์ฒ˜๋Ÿผ master-worker์˜ ๊ด€๊ณ„
    • ์›Œ์ปค ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋ผ๊ณ ๋„ ๋ถ€๋ฆ„
    • Worker thread๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์žฅ์†Œ๋ฅผ Thread Pool์ด๋ผ๊ณ  ๋ถ€๋ฆ„
  • ํ”„๋กœ์„ธ์Šค ๋‹น ์Šค๋ ˆ๋“œ ์—ฐ๊ฒฐ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๋ฐฉ์‹
  • ์Šค๋ ˆ๋“œ๋ผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•จ
    • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ํšจ์œจ์ 
    • ํ†ต์‹ ์ด ๋งŽ์€ ์„œ๋ฒ„์— ์ ์ ˆ
    • ๋ฆฌ์†Œ์Šค ์˜ค์—ผ(๊ฒฝํ•ฉ)์— ์ฃผ์˜ ํ•„์š”

์›น ์„œ๋น„์Šค ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •

์›น ์„œ๋น„์Šค ์„œ๋ฒ„์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ ์ฝ๊ธฐ/์“ฐ๊ธฐ(I/O) ๋ฐ ๋Œ€๊ธฐ

  1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์˜ค๋ฉด ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ธ HTTP ๋ฉ”์„ธ์ง€ ๋“ฑ์„ ์ฝ๋Š”๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์ž‘์—…(api๋ฅผ ํ˜ธ์ถœ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ํ˜ธ์ถœ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    • ์ด๋•Œ ์—ญ์‹œ ํ˜ธ์ถœํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค.
  3. ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์“ฐ๊ธฐ ์ž‘์—…์ด ์ง„ํ–‰๋œ๋‹ค.
  • ์œ„ ๊ณผ์ •์—์„œ ์„œ๋ฒ„๊ฐ€ ํ•˜๋Š” ์ผ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ฝ๊ธฐ & ์“ฐ๊ธฐ์™€ ์š”์ฒญ ํ›„ ๋Œ€๊ธฐ์ด๋‹ค.

I/O์— ํŠนํ™”๋œ event-loop ๋‹ค์ค‘์ฒ˜๋ฆฌ ๋ฐฉ์‹

  • ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์ด ์ฝ๊ธฐ/์“ฐ๊ธฐ(I/O) ๋ฐ ๋Œ€๊ธฐ์ธ ์›น ์„œ๋น„์Šค ์„œ๋ฒ„๋ฅผ I/O์— ํŠนํ™”๋œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋‹ค์ค‘์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹
    1. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ๊ณ„์† ๋Œ์•„๊ฐ€๋ฉฐ(event-loop) ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰
    2. ์ˆ˜ํ–‰ ๋„์ค‘ ๋ธ”๋กœํ‚น I/O ์ž‘์—…์„ ๋งŒ๋‚˜๋ฉด ์›Œ์ปค ์Šค๋ ˆ๋“œํ’€์—๊ฒŒ ์ž‘์—…์„ ๋„˜๊ฒจ์คŒ
    3. ์ž‘์—…์„ ๋„˜๊ฒจ์ค€ ๋’ค ๋ฉ”์ธ์Šค๋ ˆ๋“œ๋Š” ๊ณ„์†ํ•ด์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰
    4. ์›Œ์ปค ์Šค๋ ˆ๋“œํ’€์—๊ฒŒ ๋„˜๊ฒจ์ฃผ์—ˆ๋˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ๋ฉ”์ธ์Šค๋ ˆ๋“œ๋กœ ๋“ค์–ด์˜ด
  • ์›Œ์ปค์Šค๋ ˆ๋“œ๋“ค์€ ์ „๋žต์— ๋”ฐ๋ผ CPU Bound or I/O Bound ํ•œ ์Šค๋ ˆ๋“œ
ajax.than({
  // 1๋ฒˆ : ajax ์š”์ฒญ
  // ...(๋ธ”๋กœํ‚น I/O ์ž‘์—…์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •) 2๋ฒˆ : ๋ธ”๋กœํ‚น I/O ์ž‘์—…
});

console.log("~"); //  3๋ฒˆ
  • event-loop ์ฒ˜๋ฆฌ ์˜ˆ์ œ
    1. event-loop ์Šค๋ ˆ๋“œ์— ajax ์ฝ”๋“œ์ธ 1๋ฒˆ์ด ์‹คํ–‰๋œ๋‹ค.
    2. 2๋ฒˆ์€ ๋ธ”๋กœํ‚น I/O ์ž‘์—…์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ 2๋ฒˆ์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ณ  ์›Œ์ปค ์Šค๋ ˆ๋“œ๋กœ ์ž‘์—…์ด ๋„˜์–ด๊ฐ„๋‹ค.
    3. 3๋ฒˆ์˜ console.log()๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
    4. 2๋ฒˆ์˜ ๋ธ”๋กœํ‚น I/O ์ž‘์—…์ด ๋๋‚œ ํ›„์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ event-loop๋กœ ๋“ค์–ด์˜จ๋‹ค.
    5. ์ฆ‰, ์œ„ ์†Œ์Šค์ฝ”๋“œ๋Š” 1 -> 3 -> 2์˜ ์ˆœ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

sync/async, blocking/non-blocking

  • ๊ด€์ ์˜ ์ฐจ์ด

sync/async

  • sync/async๋Š” ์‹คํ–‰ ์ˆœ์„œ(์‹œ๊ฐ„)๋ฅผ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.
  • sync
    • ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ ˆ์ฐจ์ 
    • ์ฝ”๋“œ์˜ ์ž‘์„ฑ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ (์ „ ๋ช…๋ น์˜ ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๋‹ค.)
  • async
    • ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ ˆ์ฐจ์ ์ด์ง€ ์•Š์Œ
    • ์ „ ๋ช…๋ น์˜ ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰
    • ์•ž์„œ ์‚ดํŽด๋ณธ event-loop ๊ธฐ๋ฐ˜์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์—ญ์‹œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์—ฐ์‚ฐ๋“ค์„ ์›Œ์ปค ์Šค๋ ˆ๋“œ์—๊ฒŒ ๋„˜๊ธฐ๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ ˆ์ฐจ์ ์ด์ง€ ์•Š์€ async๋‹ค.

blocking/non-blocking

  • blocking/non-blocking์€ ์ œ์–ด๊ถŒ์˜ ๋ฐ˜ํ™˜์„ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.
  • blocking
    • ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์Œ
    • ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—์„  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ๋ชปํ•˜๊ณ  ์ œ์–ด๊ถŒ์˜ ๋ฐ˜ํ™˜์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ
  • non-blocking
    • ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜ ์ธก์—์„œ ์ œ์–ด๊ถŒ์„ ๊ณ„์† ๊ฐ€์ง (์ œ์–ด๊ถŒ์ด ๋„˜๊ฒจ์ง€์ง€ ์•Š์Œ)
    • ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๋Š” ์ œ์–ด๊ถŒ์ด ์žˆ์œผ๋ฏ€๋กœ ๊ณ„์†ํ•ด์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ์œ„์˜ event-loop ๊ตฌ์กฐ๋Š” ์›Œ์ปค ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ธ์ง€ ์ฒดํฌ ๊ณผ์ • ํ›„ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์Œ