7์ ๋ถ๊ฐ์ธ ์ ๊ณ ๋ฌ์ด ๋๋ฉด์ ์ ์ ์ธ๊ธ ๊ณ์ฐ์ ๋ฑ ํํ์ค์ ํต์ ํ์ฌ ์๋ต ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌ ์์ ์ ํ๊ณ , ์ ์ฅ์ ๋ด๋นํ๋ micro server์ CPU ์ฌ์ฉ๋ฅ ์ด ๊ธ์ฆํ์ต๋๋ค. ์ด์ ๋ํด ๋จผ์ ์ค์ผ์ผ ์ ์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ถํ ๋ฌธ์ ์ ์ ํ์ ํ์ต๋๋ค.
ํด๊ฒฐ ์์ ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ถ๋ฌธ์ฅ๋๊ป ๋ฐ์ผ๋ฉด์ CPU ์ฌ์ฉ๋ฅ ์ ๋ฎ์ถ ์ ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์์ ๋ํด ์๊ฐํด์ฃผ์ จ์ต๋๋ค. ๊ทธ์ค Thread Sleep ์ด์ผ๊ธฐ๊ฐ ๋์๊ณ , Thread Sleep ํ๋ฉด ์ง์ง ์๋ฌด ์ผ๋ ์ํ ์ง, ์๋๋ฉด ๋ค๋ฅธ ์ผ์ ํ๊ฒ ๋ ์ง์ ๋ํ ์ง๋ฌธ์ ๋ฐ์์ต๋๋ค.
์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋ธ๋ก๊ทธ ๊ธ๋ก ์ ๋ฆฌํ๋ฉด ์ข์ ๊ฑฐ ๊ฐ์์ ์ด๋ฒ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๊ฒ ๋์ต๋๋ค.
๐คThread.Sleep์ ํธ์ถํ๋ฉด ํ๊ฒ ๋๋ฉด ์ง์ง ์๋ฌด ์ผ๋ ์ ํ ๊น? ์๋๋ฉด ๋ค๋ฅธ ์ผ์ ํ๊ฒ ๋ ๊น?"
์ง๋ฌธ์ ๋ํ ์ฃผ์ฒด์ ๋ฐ๋ผ์ ๋ต๋ณ์ด ๋๋ ๊ฑฐ ๊ฐ์ต๋๋ค. ์ค๋ ๋(ํด๋น ์์ )์ ๋ํด ๋งํ ๊ฑฐ๋ผ๋ฉด ์๋ฌด ์ผ๋ ํ์ง ์๊ณ ,(์ฆ ์๋ฌด ๋์ํ์ง ์๊ณ ) CPU ๊ฐ ์ผ์ ํ๋์ง ์ ํ๋์ง์ ๋ํด ๋ฌป๋ ๊ฑฐ๋ฉด ๋น์ฐํ ๋ค๋ฅธ ์ผ์ ํ๋ค๊ณ ๋๋ตํ ์ ์์ต๋๋ค.
์ค๋ ๋ sleep ์ ํ๊ฒ ๋๋ฉด ์ค๋ ๋๋ os ๋๊ธฐ ํ๋ก ๊ฐ๊ณ ๋ช ์ํ ์๊ฐ ๋์ ์ ๋ค์ด ์๋ ์ํ๋ผ ๋์์ ํ์ง ์์ต๋๋ค. ๋์ ์ด ์ค๋ ๋๋ CPU ์ ์ ๋ฅผ ๋ด๋๊ณ , ๋๊ธฐ ์ํ๋ก ๋์ ๊ฐ๊ธฐ์, CPU๋ ๋ค๋ฅธ ์ผ์ด ์๋ค๋ฉด ๋ค๋ฅธ ์ผ์ ํ์ ๊ฒ๋๋ค.(์ปจํ ์คํธ ์ค์์นญ ๋ฐ์)
์ฆ, ์ค๋ ๋๋ ์ ๋ค๊ณ , CPU๋ ๋๊ธฐ ํ์ ์๋ ๋ค๋ฅธ ์์ ์ ํ์ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค.
์์ปค์๋ฒ์ CPU ์์น๋ฅ ์ด ๊ณ์ 99% ์ ์๋ฐํ๋ ์ด์ ๋, ํ์ ํ ์์
๋ค์ด ๋ง๊ธฐ๋๋ฌธ์ ์๋ฌด๋ฆฌ ์ค๋ ๋ sleep ์ ํ ๋ค ํด๋ ํด์ผํ ์ผ์ด ์ฐ๋๋ฏธ์ฒ๋ผ ์์๊ธฐ ๋๋ฌธ์ด๋ผ ์๊ฐํฉ๋๋ค. CPU ๊ฐ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ ์๋ณด๋ค ๋ ๋ง์ ์์
๋ค์ด ๋๊ธฐํ๊ณ ์์๊ธฐ์ ์ฌ์ฉ๋ฅ ์ด ๊ณ์ 100% ๊ฐ๊น์ด ๋ชจ๋ํฐ๋ง ๋๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค.
๐ Thread.Sleep() ๋์ ๋ฐฉ์
Thread.Sleep(milliseconds)๋ ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋๋ฅผ ์ง์ ๋ ์๊ฐ ๋์ ๋๊ธฐ ์ํ(Wait)๋ก ์ ํํฉ๋๋ค.
- Sleep ํธ์ถ ์ ํด๋น ์ค๋ ๋๋ CPU ์ ์ ๊ถ์ OS ์ค์ผ์ค๋ฌ์ ๋ฐ๋ฉํฉ๋๋ค.
- ์ค๋ ๋๋ ํ์์์์ด ๋๋ ๋๊น์ง ์คํ ๋๊ธฐ ํ(Ready Queue)์์ ์ ์ธ๋ฉ๋๋ค.
- ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ์ค์ผ์ค๋ฌ๊ฐ ๋ค์ ์คํ ๊ฐ๋ฅํ ์ํ๋ก ๋ฐ๊ฟ์ค๋๋ค.
Thread.Sleep() ํธ์ถ ์ ์ค๋ ๋์ ์ํ ๋ณํ
- ํด๋น ์ค๋ ๋๋ OS ์ค์ผ์ค๋ฌ์ ์ํด Waiting(๋๊ธฐ) ์ํ๋ก ์ ํ๋ฉ๋๋ค.
- ์ง์ ํ ์๊ฐ ๋์ CPU ์คํ ํ์์ ์ ์ธ๋๋ฉฐ, ์คํ๋์ง ์์ต๋๋ค.
CPU์ ๋์
- Sleep์ผ๋ก ๋น์์ง CPU ํ์์ฌ๋ผ์ด์ค๋ ์ค๋น ์ํ(Ready)์ ์๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ฐจ์งํฉ๋๋ค.
- OS ์ค์ผ์ค๋ฌ๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์คํ์์ผ CPU๊ฐ ๊ฐ๋ฅํ ํ ์ฌ์ง ์๊ฒ ํฉ๋๋ค. ์ด๊ฒ์ด ์ปจํ ์คํธ ์ค์์นญ์ ๋๋ค.
CPU ์ฌ์ฉ๋ฅ ์ด ๋๊ฒ ์ ์ง๋๋ ์ด์
- Sleep์ "ํด๋น ์ค๋ ๋๋ง" ๋ฉ์ถ๊ฒ ํ๋ฏ๋ก, ๋๊ธฐ ํ์ ์์ ์ด ์ถฉ๋ถํ ๋ง์ผ๋ฉด CPU๋ ๋ค๋ฅธ ์์ ์ ๊ณ์ ์คํํฉ๋๋ค.
- ๋ฐ๋ผ์ ์์ ๋๊ธฐ์ด์ด ํฌํ ์ํ๋ผ๋ฉด Sleep์ด ์์ด๋ CPU ์ฌ์ฉ๋ฅ ์ ์ฌ์ ํ 100%์ ๊ฐ๊น๊ฒ ์ ์ง๋ฉ๋๋ค
Sleep์ "ํด๋น ์ค๋ ๋"์ CPU ์ ์ ์จ์ ๋ฎ์ถ๋ ๋ฐฉ๋ฒ์ด์ง, ์ ์ฒด ์์คํ CPU ์ฌ์ฉ๋ฅ ์ ๋ฌด์กฐ๊ฑด ๋ฎ์ถ๋ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
CPU ์ฌ์ฉ๋ฅ ์ ๋ฎ์ถ๋ ค๋ฉด Sleep ์ธ์๋ ์คํ ๋๊ธฐ ์ค๋ ๋ ์๋ฅผ ์ค์ด๋ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค.
โจThread.Sleep() ๋ฅผ ์ค๋ฌด์์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ผ์ด์ค
Thread.Sleep() ์ค๋ฌด์์ ์ด๋ฅผ ํ์ฉํ๋ ๋ค์ํ ์ผ์ด์ค๋ฅผ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ํฉ์์ Sleep์ CPU ์ฌ์ฉ๋ฅ ์ ๋ฎ์ถ๋ ๋ฐ ์ ํจํ ์ ์์ต๋๋ค.
// ์๋ชป๋ ์: CPU๋ฅผ ๊ณ์ 100% ์ ์
while (true)
{
DoNothing();
}
// ๊ฐ์ ๋ ์: Sleep์ผ๋ก CPU ๋ถํ ๊ฐ์
while (true)
{
DoNothing();
Thread.Sleep(10); // 10ms ํด์ → CPU ๋ค๋ฅธ ์์
์คํ ๊ฐ๋ฅ
}
Sleep์ด CPU ์ฌ์ฉ๋ฅ ์ ๋ฎ์ถ๋ ์ด์ ๋ ๋จ์ํฉ๋๋ค.(์ ์ ์กฐ๊ฑด์ผ๋ก Ready Queue์ ์คํ ๋๊ธฐ ์ค๋ ๋๊ฐ ๊ฑฐ์ ์๊ฑฐ๋ ์์ ์์)
- ๋ฌดํ ๋ฃจํ์์ Sleep ์์ด ์ฐ์ฐํ๋ฉด ์ค๋ ๋๊ฐ ํญ์ ์คํ ์ํ์ ์์ด CPU ์ ์ ์จ์ด ์์นํฉ๋๋ค.
- Sleep์ ๋ฃ์ผ๋ฉด ํด๋น ์ค๋ ๋๊ฐ Wait ์ํ๋ก ๋น ์ ธ CPU ์ ์ ๊ถ์ ๋ค๋ฅธ ์ค๋ ๋/ํ๋ก์ธ์ค์ ์๋ณดํฉ๋๋ค.
ํ์ง๋ง, Sleep ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ์งง์ผ๋ฉด (์: Sleep(1)์ ๊ณผ๋ํ๊ฒ ํธ์ถ) ์คํ๋ ค ์ปจํ ์คํธ ์ค์์นญ ํ์๊ฐ ์ฆ๊ฐํด CPU ๋ถํ๊ฐ ๋์์ง ์ ์์ต๋๋ค. ์ด๋ OS ์ค์ผ์ค๋ฌ ์ค๋ฒํค๋ ๋๋ฌธ์ ๋๋ค.
์์ ๊ฐ์ ๊ฒฝ์ฐ Sleep์ ํธ์ถํ๋ฉด ํด๋น ์ค๋ ๋๊ฐ Waiting ์ํ๋ก ์ ํ๋๊ณ , Ready Queue์๋ ๋จ์ ์๋ ์ค๋ ๋๊ฐ ์์ผ๋ CPU๋ ์คํํ ์์
์ด ์์ต๋๋ค.
CPU๋ ์ด๋ Idle ์ํ(๋๊ธฐ ์ํ)๋ก ๋ค์ด๊ฐ๋ฉฐ, ์ ๋ ฅ ์๋ชจ์ ์ฌ์ฉ๋ฅ ์ด ์ค์ด๋ญ๋๋ค.
์ด๋ฐ ์ํฉ์ด ๋ฌดํ ๋ฃจํ + Sleep ํจํด์์ CPU ์ ์ ์จ์ ๋ฎ์ถ๋ ์ด์ ์
๋๋ค.
โ ์ค๋ฌด ์ ์ฉ ์ฌ๋ก
์ฌ๋ด ์๋ฃจ์ ๋ํด ํ์ ํด๋ณด๋ ๋ค์๊ณผ ๊ฐ์ ๋ค ๊ฐ์ง ๋ํ ์ฌ์ฉ ์ผ์ด์ค๊ฐ ์์์ต๋๋ค.
1๏ธโฃ CPU ๋ถํ ์กฐ์ (Throttling)
๋ณ๋ ฌ ์์ (Parallel.ForEach ๋ฑ) ์ํ ์ CPU๋ฅผ ๊ณผ๋ํ๊ฒ ์ ์ ํ์ง ์๋๋ก Sleep์ ์ฌ์ฉํฉ๋๋ค.
Parallel.ForEach(GetExportedTypes(assembly), (type) => {
if (!RegisterGlobalProperty(type)) {
RegisterGlobalFeature(type);
}
Thread.Sleep(1); // CPU ์ค๋กํ๋ง + ์ค๋ ๋ ์๋ณด
});
๋ชฉ์
- CPU ๊ณผ์ ์ ๋ฐฉ์ง
- ๋ค๋ฅธ ์ค๋ ๋ ์คํ ๊ธฐํ ์ ๊ณต (์๋ณด)
2๏ธโฃ์ธ๋ถ ์ปดํฌ๋ํธ/๋คํธ์ํฌ ์์ฒญ ๊ฐ๊ฒฉ ์กฐ์
์ธ๋ถ ์ปดํฌ๋ํธ์์๋ ์๋์ ์ผ๋ก๋ , ์ฑ๋ฅ์ ์ด์ ๋๋ฌธ์ด๋ ํธ๋ํฝ์ ์ ํํ๊ธฐ๋ ํฉ๋๋ค.
์ธ๋ถ ์ปดํฌ๋ํธ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฐ๋ฆฌ ํ์ฌ๋ง์ด ์๋ ๊ฒ ์๋๊ธฐ๋ ํ๊ณ , ์ธํฐ๋ท ๋์ญํญ์ ์ ํ๋ ์๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์งง์ ์๊ฐ ๋ด ๊ณผ๋ํ ์์ฒญ์ ์๋ฒ ๋ถํ, ๋คํธ์ํฌ ๋์ญํญ ๋ฌธ์ , ์ฌ์ง์ด ๋ฒค(Ban) ์ฒ๋ฆฌ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
//์ธ๋ถ ์ํ API ์์ฒญ
//์ ์ฒ๋ฆฌ ๋ก์ง
sleep(30);
const result = rac.execute({ // ์ธ๋ถ ํต์
set_cookies: e2e_auth_cookie,
session_name: session_name,
data: post_data,
});
3๏ธโฃ ์ฃผ๊ธฐ์ ์์ ์คํ
์ผ์ ์ฃผ๊ธฐ๋ง๋ค ๋ฐ๋ณต๋๋ ์์ ์ ๊ฒฝ์ฐ Sleep์ ํ์ฉํด ๋์ ๊ฐ๊ฒฉ์ ๋ณด์ฅํฉ๋๋ค.
// E2E ์ฌ์๋ ๋ก์ง
if (retry_count < 2) {
retry_count++;
sleep(5000); // 5์ด ๋๊ธฐ ํ ์ฌ์๋
return ActionResult.redirectToWorker(new ScrapingStartData(request));
}
4๏ธโฃํธ๋ํฝ/๋ฉ์์ง ๋ฐํ ์๋ ์ ์ดํ์ฌ ๋ณ๋ชฉ ๋ฌธ์ ๋ฐ์ ๋ฐฉ์ง
์งง์ ์๊ฐ๋ด์ ๋๊ท๋ชจ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ๋ฉด Publisher ๊ฐ ๊ฐ๋นํ์ง ๋ชปํ๊ณ ์ ์ค๋๋ ๋ฉ์์ง๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ฌธ์ ์ ์๋น์ค ์ ๋ขฐ๋ ํ๋ฝ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Sleep์ผ๋ก ๋ฐํ ๊ฐ๊ฒฉ์ ์ฃผ์ด ์์ ์ฑ์ ํ๋ณดํ์ฌ, Publisher ๊ฐ ์ ์ค ์์ด ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
// ๋ฉ์ธ์ง ๋ฐํ
sleep(sleep_time);
ActionResult.redirectToWorker(new CreateInventory(data));
๐ก๋ง๋ฌด๋ฆฌ
Thread.Sleep()์ ๋จ์ํ "์ ๊น ์ฌ๋" ๋ฉ์๋๊ฐ ์๋๋ผ, ์ค๋ ๋ ์ค์ผ์ค๋ง๊ณผ CPU ์์ ๊ด๋ฆฌ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ๋๊ตฌ์
๋๋ค.
์ค๋ฌด์์๋ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ณ๋ ฌ ์์ ์ CPU ๊ณผ์ ์ ๋ฐฉ์ง
- ์ธ๋ถ ์๋น์ค ํธ์ถ ๊ฐ๊ฒฉ ์ ํ
- ์ฃผ๊ธฐ์ ์์ ๊ฐ๊ฒฉ ๋ณด์ฅ
- ํธ๋ํฝ/๋ฉ์์ง ๋ฐํ ์๋ ์ ์ด
ํ์ง๋ง, ์๋ชป๋ Sleep ์ฌ์ฉ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์ผ๋,
Sleep ์ฃผ๊ธฐ์ ๋ชฉ์ ์ ๋ช
ํํ ์ค๊ณํ๊ณ , ๊ฐ๋ฅํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐฉ์๊ณผ ๋ณํํด ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์์ ์
๋๋ค.
'Computer Science > Operating System' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Process ์ Thread ์ฃผ์๊ณต๊ฐ ์ฐจ์ด์ ์ปจํ ์คํธ ์ค์์นญ ์ฐจ์ด (0) | 2024.07.27 |
---|
๋๊ธ