λ€νΈμν¬
λ€μ€ μ²λ¦¬ λ°©μ
vividswan
2022. 5. 3. 21:31
κΈ°μ‘΄μ 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) λ° λκΈ°
- ν΄λΌμ΄μΈνΈμ μμ²μ΄ μ€λ©΄ μμ²μΌλ‘ λ³΄λΈ HTTP λ©μΈμ§ λ±μ μ½λλ€.
- ν΄λΌμ΄μΈνΈμ μμ²μ μ²λ¦¬νλ μμ
μ μννλ€.
- μλ²κ° μμ²μ μ²λ¦¬νκΈ° μν΄ νΉμ μμ (apiλ₯Ό νΈμΆ, λ°μ΄ν° μ²λ¦¬ λ±)μ νΈμΆ ν κ²°κ³Όλ₯Ό κΈ°λ€λ¦°λ€.
- μ΄λ μμ νΈμΆν μμ μ΄ μλ£λλ©΄ κ²°κ³Όλ₯Ό μ½μ΄μΌ νλ€.
- λͺ¨λ μ²λ¦¬κ° μλ£λλ©΄ κ²°κ³Όλ₯Ό ν΄λΌμ΄μΈνΈμκ² λ³΄λ΄κΈ° μν΄μ μ°κΈ° μμ μ΄ μ§νλλ€.
- μ κ³Όμ μμ μλ²κ° νλ μΌμ λλΆλΆμ μ½κΈ° & μ°κΈ°μ μμ² ν λκΈ°μ΄λ€.
I/Oμ νΉνλ event-loop λ€μ€μ²λ¦¬ λ°©μ
- λλΆλΆμ μμ
μ΄ μ½κΈ°/μ°κΈ°(I/O) λ° λκΈ°μΈ μΉ μλΉμ€ μλ²λ₯Ό I/Oμ νΉνλ μ±κΈ μ€λ λλ‘ λ€μ€μ²λ¦¬λ₯Ό νλ λ°©μ
- μ±κΈ μ€λ λλ κ³μ λμκ°λ©°(event-loop) λΉμ¦λμ€ λ‘μ§μ μν
- μν λμ€ λΈλ‘νΉ I/O μμ μ λ§λλ©΄ μ컀 μ€λ λνμκ² μμ μ λ겨μ€
- μμ μ λκ²¨μ€ λ€ λ©μΈμ€λ λλ κ³μν΄μ λΉμ¦λμ€ λ‘μ§μ μν
- μ컀 μ€λ λνμκ² λ겨주μλ μμ μ΄ μλ£λλ©΄ λ€μ λ©μΈμ€λ λλ‘ λ€μ΄μ΄
- μ컀μ€λ λλ€μ μ λ΅μ λ°λΌ CPU Bound or I/O Bound ν μ€λ λ
ajax.than({
// 1λ² : ajax μμ²
// ...(λΈλ‘νΉ I/O μμ
μ΄ μλ€κ³ κ°μ ) 2λ² : λΈλ‘νΉ I/O μμ
});
console.log("~"); // 3λ²
- event-loop μ²λ¦¬ μμ
- event-loop μ€λ λμ ajax μ½λμΈ 1λ²μ΄ μ€νλλ€.
- 2λ²μ λΈλ‘νΉ I/O μμ μ΄ μλ€κ³ κ°μ ν λ 2λ²μ λ©μΈ μ€λ λμμ μνλμ§ μκ³ μ컀 μ€λ λλ‘ μμ μ΄ λμ΄κ°λ€.
- 3λ²μ console.log()κ° μ€νλλ€.
- 2λ²μ λΈλ‘νΉ I/O μμ μ΄ λλ νμ κ²°κ³Όκ° λ©μΈ μ€λ λμ event-loopλ‘ λ€μ΄μ¨λ€.
- μ¦, μ μμ€μ½λλ 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 ꡬ쑰λ μ컀 μ€λ λμμ νΈμΆλ ν¨μκ° μνλλ€λ©΄ κ·Έ ν¨μμ λν κ²°κ³Όκ°μ λ°μ μ μλ μν©μΈμ§ μ²΄ν¬ κ³Όμ ν κ²°κ³Όκ°μ λ°μ