์๋ ํ์ธ์.
๋๋ ์๊ฐ๊ณผ ์ํ์ฐฉ์ค์ ๊ฒฐ๊ณผ์ธ ๋ด ๋ฐ๊ฒฌ์ ๊ณต์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ฌผ๋ก ์ด๊ฒ์ ๋ฐ๊ฒฌ๋ ๊ฒ์ด ์๋๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ์์ฉ ํต๊ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ๋ชจ๋ ์์คํ
์ ์ต์ ํ์ ๊ด์ฌํ๋ ์ฌ๋๋ค(๊ผญ DBMS์ผ ํ์๋ ์์)์๊ฒ ์ค๋ซ๋์ ์๋ ค์ ธ ์์์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ : ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ค์ ์์ ์ ์ฐ๊ตฌ์ ๋ํด ํฅ๋ฏธ๋ก์ด ๊ธฐ์ฌ๋ฅผ ์ด๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ฐ๋ฉด์, IT ์ ๋ฌธ๊ฐ์ธ DBA ์ฌ์ด์์ ์ธํฐ๋ท์์ ์ด ์ ๊ทผ ๋ฐฉ์์ด ๋๋ฆฌ ์ธ๊ธ๋๊ฑฐ๋ ์ ํ๋๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ต๋๋ค.
๊ทธ๋์ ์์ ๊น์ง.
์ด๋ค ์ข ๋ฅ์ ์์ ์ ์๋น์คํ๊ธฐ ์ํด ํน์ ์๋น์ค ์์คํ ์ ์ค์ ํ๋ ์์ ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ์์ ์ ๋ํด์๋ ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง, ์ด ์์ ์ ํ์ง์ ์ด๋ป๊ฒ ์ธก์ ํ๋์ง, ์ด ํ์ง์ ์ธก์ ํ๋ ๊ธฐ์ค์ ๋ฌด์์ธ์ง๊ฐ ์๋ ค์ ธ ์์ต๋๋ค.
๋ํ ์ด ์๋น์ค ์์คํ ์์ ์์ ์ด ์ํ๋๋ ๋ฐฉ์์ด ์ด๋ ์ ๋ ์๋ ค์ ธ ์๊ณ ์ดํด๋์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
"๋ค์" - ์ด๋ ์์ฐ ๋จ๊ณ์ ์ถฉ๋ถํ ์ ํฉํ ํ ์คํธ ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์์คํ ์ ํฉ์ฑํ๊ณ ์ ์ฉํ ์ ์๋ ํน์ ๋๊ตฌ, ์ ํธ๋ฆฌํฐ, ์๋น์ค๋ฅผ ์ค๋น(๋๋ ์ด๋๊ฐ์์ ๊ฐ์ ธ์ค๋)ํ๋ ๊ฒ์ด ๊ฐ๋ฅํจ์ ์๋ฏธํฉ๋๋ค. ์์ฐ ์์ ์ ์ถฉ๋ถํ ์ ํฉํ ์กฐ๊ฑด์์.
๊ธ์, ์์ ์์ฐ์ฑ ์ธก๋ฉด์์ ์ด ์์คํ ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ด ์๋น์ค ์์คํ ์ ๋ํ ์ผ๋ จ์ ์กฐ์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ค์ ธ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น? ์ด ์๋น์ค ์์คํ ์ ๋ํ ์์ ํ ์ดํด๊ฐ ์ถฉ๋ถํ์ง ์์ ํน์ ํ๋ซํผ์ ํฅํ ๋ก๋์ ๋ํด ์ด ์์คํ ์ ์ค์ ์ ์ ๋ฌธ์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ ์์คํ ์ ํ์ํ ์์ฐ์ฑ์ ์ป์ ์ ์์ต๋๋ค.
์. ์ด๊ฒ์ ๊ฑฐ์ ํญ์ ๊ทธ๋ ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์์ ํ ์ ์๋์?
๊ธ์, ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฒ์ ์ด ์์คํ ์ ๋ํ ๋ฌธ์๋ฅผ ๋ณด๋ ๊ฒ์ ๋๋ค. ์กฐ์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ํ์ฉ๋๋ ๋ฒ์๊ฐ ๋ฌด์์ธ์ง ์ดํดํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ขํ ํ๊ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํ ์คํธ์์ ์์คํ ๋งค๊ฐ ๋ณ์ ๊ฐ์ ์ ํํฉ๋๋ค.
์ ๊ฒ๋ค. ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์์ ๋ํ ํน์ ๊ฐ ์ธํธ์ ํํ๋ก ์์คํ ์ ์ผ์ข ์ ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์ด ๋๊ตฌ ์ ํธ๋ฆฌํฐ ๋ก๋ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ ๋ก๋๋ฅผ ์ ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ(์๋ต ๋๋ ์์คํ
ํ์ง ์ธก์ ๊ธฐ์ค)์ ์ดํด๋ณด์ธ์.
๋ ๋ฒ์งธ ์๊ฐ์ ์ด๊ฒ์ด ๋งค์ฐ ์ค๋ ์๊ฐ์ด๋ผ๋ ๊ฒฐ๋ก ์ผ ์๋ ์๋ค.
์ฆ, ์ค์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๊ณ , ์คํ๋๋ ๊ฐ์ ๋ฒ์๊ฐ ํฌ๊ณ , ๊ฐ ๊ฐ๋ณ ๋ถํ ํ ์คํธ๋ฅผ ์๋ฃํ๋ ๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ, ์, ์ด ๋ชจ๋ ์์ ์ ํ์ฉํ ์ ์์ ์ ๋๋ก ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ฅ๊ธฐ.
๊ธ์์, ์ฌ๋ฌ๋ถ์ด ์ดํดํ๊ณ ๊ธฐ์ตํ ์ ์๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋น์ค ์์คํ ์ค์ ๋งค๊ฐ๋ณ์์ ๊ฐ ์ธํธ์๋ ์ผ๋ถ ๊ฐ์ ์ํ์ค๋ก ๋ฒกํฐ๊ฐ ์์์ ์ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ฐ ๋ฒกํฐ๋ (์ด ๋ฒกํฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค๋ ์ ์์) ๋ค๋ฅธ ๊ฒ๋ค์ด ๋์ผํ๋ค๋ ์ ์์ ์์ ํ ๋ช ํํ ๋ฉํธ๋ฆญ ๊ฐ, ์ฆ ํ ์คํธ ๋ก๋ ํ์์ ์์คํ ์๋ ํ์ง์ ๋ํ๋ด๋ ์งํ์ ํด๋นํฉ๋๋ค.
์ฆ,
์์คํ ๊ตฌ์ฑ ๋ฒกํฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ์ํ๊ฒ ์ต๋๋ค. ์ด๋์์ ; ์ด๋ โ ์์คํ ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์์ ์, ์ด๋ฌํ ๋งค๊ฐ๋ณ์๊ฐ ๋ช ๊ฐ ์๋์ง.
๊ทธ๋ฆฌ๊ณ ์ด์ ๋์ํ๋ ๋ฉํธ๋ฆญ์ ๊ฐ์ ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ํ์ํ์
, ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ํจ์๋ฅผ ์ป์ต๋๋ค:
๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ๊ฒ์ด ์ฆ๊ฐ์ ์ผ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. ์ ๊ฒฝ์ฐ์๋ ํ์ ์์ ์๋ ๊ฑฐ์ ์์ด๋ฒ๋ ธ๋ ํจ์์ ๊ทน๊ฐ์ ๊ฒ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋์์ต๋๋ค.
์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๊ฒ์ธ์ง์ ๋ํ ์กฐ์ง์ ์ด๊ณ ์ ์ฉ ๊ฐ๋ฅํ ์ง๋ฌธ์ด ๋ฐ์ํฉ๋๋ค.
- ์ด๋ค ์๋ฏธ์์๋ ์์ผ๋ก ์ฝ๋ฉํ๋ ์ผ์ด ์ค์ด๋ญ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์๋ํ๋ ค๋ฉด, ์ฆ ๊ทน๊ฐ(์๋ ๊ฒฝ์ฐ)์ ์ฐพ์์ต๋๋ค. ์, ์ ์ด๋ ์ขํ ํ๊ฐ๋ณด๋ค ๋น ๋ฆ ๋๋ค.
์ฒซ ๋ฒ์งธ ์์ ์ ๊ทธ๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ฏธ ๊ตฌํ๋์ด ์๊ณ ์ด๋ค ํํ๋ก๋ ์ฝ๋์์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋ ์ผ๋ถ ํ๊ฒฝ์ ์ดํด๋ณผ ํ์๊ฐ ์์์ ์์ํฉ๋๋ค.
๊ธ์, ๋๋ ์์ python
ะธ cran-r
๋ ๋ฒ์งธ ์์ ์ ์๊ณ ๋ฆฌ์ฆ ์์ฒด, ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง, ์๊ตฌ ์ฌํญ์ด ๋ฌด์์ธ์ง, ์์ ์ ํน์ง์ ๋ํด ์ฝ์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ์ ๊ณตํ๋ ๊ฒ์ ๊ฒฐ๊ณผ ๋๋ ์๊ณ ๋ฆฌ์ฆ ์์ฒด์์ ์ง์ ์ ์ผ๋ก ์ ์ฉํ ๋ถ์์ฉ์ด ๋ ์ ์์ต๋๋ค.
๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐ๊ณผ๋ก๋ถํฐ ์ป์ ์๋ ์์ต๋๋ค.
์ ๋ ฅ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ง์ ๊ฒ์ด ๋ฌ๋ผ์ง๋๋ค.
์๋ฅผ ๋ค์ด, ์ด๋ค ์ด์ ๋ก๋ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋นจ๋ฆฌ ์ป์ด์ผ ํ๋ค๋ฉด ๊ฒฝ์ฌํ๊ฐ๋ฒ ์๊ณ ๋ฆฌ์ฆ์ ์ดํด๋ณด๊ณ ๊ทธ ์ค ํ๋๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
๋๋ ์๊ฐ์ด ๊ทธ๋ค์ง ์ค์ํ์ง ์๋ค๋ฉด ์๋ฅผ ๋ค์ด ์ ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ ํ๋ฅ ๋ก ์ ์ต์ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ์ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์์คํ ๊ตฌ์ฑ์ ์ ํํ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์์ ์ ๋ค์์ผ๋ก ๋งํ์๋ฉด ์คํ์ค ์์ ์ผ๋ก ๊ณ ๋ คํ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ถ์ฒ:
- ์๋น์ค ์์คํ
์ผ๋ก์ ๋ค์์ ์ํํ์ญ์์ค.
oracle xe 18c
- ํธ๋์ญ์ ํ๋๊ณผ ๋ชฉํ(ํธ๋์ญ์ /์ด ๋จ์)์์ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ๋ฅํ ์ต๊ณ ์ฒ๋ฆฌ๋์ ์ป๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ญ์์ค.
- ํธ๋์ญ์
์ ๋ฐ์ดํฐ ์์
์ ์ฑ๊ฒฉ๊ณผ ์์
์ปจํ
์คํธ์ ๋ฐ๋ผ ๋งค์ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค.
์ด๋ ๋๋์ ํ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ํธ๋์ญ์ ์ด๋ผ๋ ์ ์ ๋์ํฉ์๋ค.
๋ค์ ์คํ๋ณด๋ค ๋ ๋ง์ ์คํ ์ทจ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ง ์์ผ๋ฉฐ ๋ง์ ๋น์จ์ ํ๊ณผ ํฐ ํ ์ด๋ธ์ ์ฒ๋ฆฌํ์ง ์๋๋ค๋ ์๋ฏธ์ ๋๋ค.
์ด๋ ์ด ํ ์ด๋ธ์ ์์์ ์ธ๋ฑ์ค๊ฐ ์๋ ๋ค์ ํฐ ํ ์ด๋ธ์ ํ ํ์ ๋ณ๊ฒฝํ๋ ํธ๋์ญ์ ์ ๋๋ค.
์ด ์ํฉ์์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฐ์ฑ์ ์์ฝ์ ๋ฐ๋ผ ์ฐํํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฒ๋ฆฌ ํ์ง์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
๋ฉด์ฑ ์กฐํญ - subdb ์ค์ ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ด์ผ๊ธฐํ๋ ๊ฒฝ์ฐ.
์๋ํ๋ฉด ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ํ ์ด๋ธ ํ์ ๋ฐ์ดํฐ ๋ฐ/๋๋ ํ ์ด๋ธ ํ์ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ฌ์ฉ์ ์์ ์ค๊ณ๋ก ์ธํด SQL ์ธ์ ๊ฐ์ ํธ๋์ญ์ ์ ๊ธ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฌผ๋ก ์ด๋ TPS ์งํ์ ์ฐ์ธํ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ฉฐ ์ด๋ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จํ์ฌ ์ธ์์ ์์ธ์ด ๋ ๊ฒ์ ๋๋ค. ์, ์ด๊ฒ์ด ํ ํ์ ๋ชจ๋ธ์ด ์ค๊ณ๋ ๋ฐฉ์๊ณผ ๋งํ์ด ๋ฐ์ํ๋ ๋ด๋ถ ๋ฐ์ดํฐ ์์ ๋ฐฉ์์ ๋๋ค.
๋ฐ๋ผ์ ์คํ์ ์์์ฑ์ ์ํด ์ด ์์๋ ์ ์ธํ๊ณ , ์๋์์๋ ๊ทธ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
- ๋ช
ํ์ฑ์ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ถ๋ SQL ๋ช
๋ น์ 100%๊ฐ DML ๋ช
๋ น์ด๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
ํ ์คํธ์์๋ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์ ํน์ฑ์ด ๋์ผํ๋๋ก ํ์ญ์์ค.
์ฆ, skl ์ธ์ ์, ํ ํ์ ๋ฐ์ดํฐ, skl ์ธ์ ์ด ์ด๋ค๊ณผ ์๋ํ๋ ๋ฐฉ์์ ๋๋ค. - Subd๋ ๋ค์์์ ์๋ํฉ๋๋ค.
FORCE LOGGING
,ARCHIVELOG
๊ฐ์กฐ. ํ๋์๋ฐฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋๋ ํ์ ๋ ๋ฒจ์์ ๊บผ์ง๋๋ค. - Redo ๋ก๊ทธ: ๋ณ๋์ ํ์ผ ์์คํ
, ๋ณ๋์ "๋์คํฌ"์ ์์นํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋จธ์ง ๋ฌผ๋ฆฌ์ ๊ตฌ์ฑ์์: ๋ณ๋์ "๋์คํฌ"์ ์๋ ๋ ๋ค๋ฅธ ๋ณ๋์ ํ์ผ ์์คํ :
๋ฌผ๋ฆฌ์ ์ฅ์น์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋๋ค. ์คํ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ์์
SQL> select status||' '||name from v$controlfile;
/db/u14/oradata/XE/control01.ctl
SQL> select GROUP#||' '||MEMBER from v$logfile;
1 /db/u02/oradata/XE/redo01_01.log
2 /db/u02/oradata/XE/redo02_01.log
SQL> select FILE_ID||' '||TABLESPACE_NAME||' '||round(BYTES/1024/1024,2)||' '||FILE_NAME as col from dba_data_files;
4 UNDOTBS1 2208 /db/u14/oradata/XE/undotbs1_01.dbf
2 SLOB 128 /db/u14/oradata/XE/slob01.dbf
7 USERS 5 /db/u14/oradata/XE/users01.dbf
1 SYSTEM 860 /db/u14/oradata/XE/system01.dbf
3 SYSAUX 550 /db/u14/oradata/XE/sysaux01.dbf
5 MONITOR 128 /db/u14/oradata/XE/monitor.dbf
SQL> !cat /proc/mounts | egrep "/db/u[0-2]"
/dev/vda1 /db/u14 ext4 rw,noatime,nodiratime,data=ordered 0 0
/dev/mapper/vgsys-ora_redo /db/u02 xfs rw,noatime,nodiratime,attr2,nobarrier,inode64,logbsize=256k,noquota 0 0
์ฒ์์๋ ์ด๋ฌํ ๋ก๋ ์กฐ๊ฑด์์ transaction subd๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์์ต๋๋ค.
์ ๋ง ๋๋ผ์ด ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ ์์ ๋ง์ ์ธ์ฉํ๊ฒ ์ต๋๋ค.
SLOB์ ํต์ฌ์ 'SLOB ๋ฐฉ์'์ด๋ค. SLOB ๋ฐฉ๋ฒ์ ํ๋ซํผ ํ ์คํธ๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๊ฒฝํฉ ์์ด. ํ๋์จ์ด ์ฑ๋ฅ์ ์ต๋ํํ ์๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธ ๋๋ ์ฌ์ง์ด๋ ๋ฐ์ธ๋ฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ธ๋ก์ ๊ณต์ ํฉ๋๋ค. ๋ง์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ฉด ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ์ดํฐ ๋ธ๋ก์์! ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ ๋ฐฐํฌ์ SLOB๋ ์ด๋ฌํ ๊ฒฝํฉ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
์ด ์ ์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cl ์ธ์
์ ๋ณ๋ ฌ์ฑ ์ ๋๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ์ด๊ฒ์ด ํต์ฌ์
๋๋ค. -t
์ ํธ๋ฆฌํฐ๋ฅผ ์คํํ๋ค runit.sh
SLOB์์
DML ๋ช
๋ น์ ๋น์จ์ ํ์ ํญ๋ชฉ, ๊ฐ ํ
์คํธ ์ธ์
, ๋งค๊ฐ๋ณ์๋ก ์ ์ก๋๋ ํ
์คํธ ๋ฉ์์ง ์๋ก ๊ท์ ๋ฉ๋๋ค. UPDATE_PCT
๋ณ๋๋ก ๋งค์ฐ ํธ๋ฆฌํ๊ฒ: SLOB
๋ก๋ ์ธ์
์ ํ์ ์์ฒด์ ์ผ๋ก - statspack ๋๋ awr-snapshots(์ค๋นํ๋๋ก ์ค์ ๋ ๊ฒ)์ ์ค๋นํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ฐํ์ก๋ค SLOB
30์ด ๋ฏธ๋ง์ SQL ์ธ์
์ ์ง์ํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ๋๋ ๋จผ์ ๋ด ์์ ์ ๋
ธ๋์-๋๋ฏผ ๋ฒ์ ์ ๋ก๋๋ฅผ ์ฝ๋ฉํ ๋ค์ ๊ณ์ ์๋ํ์ต๋๋ค.
๋ช
ํ์ฑ์ ์ํด ๋ก๋๊ฐ ์ํํ๋ ์์
๊ณผ ์ํ ๋ฐฉ๋ฒ์ ๋ช
ํํ ํ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ก๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ์ ์ฝ๋
function dotx()
{
local v_period="$2"
[ -z "v_period" ] && v_period="0"
source "/home/oracle/testingredotracะต/config.conf"
$ORACLE_HOME/bin/sqlplus -S system/${v_system_pwd} << __EOF__
whenever sqlerror exit failure
set verify off
set echo off
set feedback off
define wnum="$1"
define period="$v_period"
set appinfo worker_&&wnum
declare
v_upto number;
v_key number;
v_tots number;
v_cts number;
begin
select max(col1) into v_upto from system.testtab_&&wnum;
SELECT (( SYSDATE - DATE '1970-01-01' ) * 86400 ) into v_cts FROM DUAL;
v_tots := &&period + v_cts;
while v_cts <= v_tots
loop
v_key:=abs(mod(dbms_random.random,v_upto));
if v_key=0 then
v_key:=1;
end if;
update system.testtab_&&wnum t
set t.object_name=translate(dbms_random.string('a', 120), 'abcXYZ', '158249')
where t.col1=v_key
;
commit;
SELECT (( SYSDATE - DATE '1970-01-01' ) * 86400 ) into v_cts FROM DUAL;
end loop;
end;
/
exit
__EOF__
}
export -f dotx
์์ ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์๋ฉ๋๋ค.
์ผํ๋ ๋ ธ๋์
echo "starting test, duration: ${TEST_DURATION}" >> "$v_logfile"
for((i=1;i<="$SQLSESS_COUNT";i++))
do
echo "sql-session: ${i}" >> "$v_logfile"
dotx "$i" "${TEST_DURATION}" &
done
echo "waiting..." >> "$v_logfile"
wait
๊ทธ๋ฆฌ๊ณ ์์ ์๋ฅผ ์ํ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋น๋ฉ๋๋ค.
ํ ์ด๋ธ ์์ฑ
function createtable() {
source "/home/oracle/testingredotracะต/config.conf"
$ORACLE_HOME/bin/sqlplus -S system/${v_system_pwd} << __EOF__
whenever sqlerror continue
set verify off
set echo off
set feedback off
define wnum="$1"
define ts_name="slob"
begin
execute immediate 'drop table system.testtab_&&wnum';
exception when others then null;
end;
/
create table system.testtab_&&wnum tablespace &&ts_name as
select rownum as col1, t.*
from sys.dba_objects t
where rownum<1000
;
create index testtab_&&wnum._idx on system.testtab_&&wnum (col1);
--alter table system.testtab_&&wnum nologging;
--alter index system.testtab_&&wnum._idx nologging;
exit
__EOF__
}
export -f createtable
seq 1 1 "$SQLSESS_COUNT" | xargs -n 1 -P 4 -I {} -t bash -c "createtable "{}"" | tee -a "$v_logfile"
echo "createtable done" >> "$v_logfile"
์ ๊ฒ๋ค. ๊ฐ ์์ ์(์ค์ง์ ์ผ๋ก DB์ ๋ณ๋ SQL ์ธ์ )์ ๋ํด ์์ ์๊ฐ ์์ ํ๋ ๋ณ๋์ ํ ์ด๋ธ์ด ์์ฑ๋ฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์์
์ ์ธ์
๊ฐ์ ํธ๋์ญ์
์ ๊ธ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
๊ฐ ์์
์๋ ๋์ผํ ์์
์ ์ํํฉ๋๋ค. ์์ ์ ํ
์ด๋ธ์ ์ฌ์ฉํ์ฌ ํ
์ด๋ธ์ ๋ชจ๋ ๋์ผํฉ๋๋ค.
๋ชจ๋ ๊ทผ๋ก์๋ ๋์ผํ ์๊ฐ ๋์ ์์
์ ์ํํฉ๋๋ค.
๋ํ ์๋ฅผ ๋ค์ด ๋ก๊ทธ ์ ํ์ด ํ์คํ ๋ฐ์ํ๊ณ ๋ ๋ฒ ์ด์ ๋ฐ์ํ๋๋ก ์ถฉ๋ถํ ์ค๋ ์๊ฐ ๋์ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ ๊ด๋ จ ๋น์ฉ๊ณผ ํจ๊ณผ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ์์
์์ ์์
์๊ฐ์ 8๋ถ์ผ๋ก ๊ตฌ์ฑํ์ต๋๋ค.
๋ก๋ ์ค์ธ ์๋ธ์ ์๋์ ์ค๋ช ํ๋ statspack ๋ณด๊ณ ์์ ์ผ๋ถ
Database DB Id Instance Inst Num Startup Time Release RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
2929910313 XE 1 07-Sep-20 23:12 18.0.0.0.0 NO
Host Name Platform CPUs Cores Sockets Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
billing.izhevsk1 Linux x86 64-bit 2 2 1 15.6
Snapshot Snap Id Snap Time Sessions Curs/Sess Comment
~~~~~~~~ ---------- ------------------ -------- --------- ------------------
Begin Snap: 1630 07-Sep-20 23:12:27 55 .7
End Snap: 1631 07-Sep-20 23:20:29 62 .6
Elapsed: 8.03 (mins) Av Act Sess: 8.4
DB time: 67.31 (mins) DB CPU: 15.01 (mins)
Cache Sizes Begin End
~~~~~~~~~~~ ---------- ----------
Buffer Cache: 1,392M Std Block Size: 8K
Shared Pool: 288M Log Buffer: 103,424K
Load Profile Per Second Per Transaction Per Exec Per Call
~~~~~~~~~~~~ ------------------ ----------------- ----------- -----------
DB time(s): 8.4 0.0 0.00 0.20
DB CPU(s): 1.9 0.0 0.00 0.04
Redo size: 7,685,765.6 978.4
Logical reads: 60,447.0 7.7
Block changes: 47,167.3 6.0
Physical reads: 8.3 0.0
Physical writes: 253.4 0.0
User calls: 42.6 0.0
Parses: 23.2 0.0
Hard parses: 1.2 0.0
W/A MB processed: 1.0 0.0
Logons: 0.5 0.0
Executes: 15,756.5 2.0
Rollbacks: 0.0 0.0
Transactions: 7,855.1
์คํ์ค ์์
์ผ๋ก ๋์๊ฐ๋๋ค.
๋ค๋ฅธ ์กฐ๊ฑด์ด ๋์ผํ๋ค๋ฉด ์คํ์ค ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ณ๊ฒฝํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๊ทธ ๊ทธ๋ฃน์ ํฌ๊ธฐ์ ๋๋ค. ๊ฐ ๋ฒ์: [32, 1024]MB;
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ ๊ทธ๋ฃน ์์ ๋๋ค. ๊ฐ ๋ฒ์: [2,32];
log_archive_max_processes
๊ฐ ๋ฒ์: [1,8];commit_logging
๋ ๊ฐ์ง ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค.batch|immediate
;commit_wait
๋ ๊ฐ์ง ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค.wait|nowait
;log_buffer
๊ฐ ๋ฒ์: [2,128]MB.log_checkpoint_timeout
๊ฐ ๋ฒ์: [60,1200]์ดdb_writer_processes
๊ฐ ๋ฒ์: [1,4]undo_retention
๊ฐ ๋ฒ์: [30;300]์ดtransactions_per_rollback_segment
๊ฐ ๋ฒ์: [1,8]disk_asynch_io
๋ ๊ฐ์ง ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค.true|false
;filesystemio_options
๋ค์ ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค.none|setall|directIO|asynch
;db_block_checking
๋ค์ ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค.OFF|LOW|MEDIUM|FULL
;db_block_checksum
๋ค์ ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค.OFF|TYPICAL|FULL
;
Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ง ๊ด๋ฆฌ ๊ฒฝํ์ด ์๋ ์ฌ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ์์ ์ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฐ์ฑ์ ๋์ด๊ธฐ ์ํด ์ง์ ๋ ๋งค๊ฐ ๋ณ์์ ํ์ฉ ๊ฐ๋ฅํ ๊ฐ ์ค์์ ๋ฌด์์ ์ด๋ค ๊ฐ์ผ๋ก ์ค์ ํด์ผ ํ๋์ง ์ด๋ฏธ ๋งํ ์ ์์ต๋๋ค. ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋.
๊ทธ๋ฌ๋.
์คํ์ค ์์ ์ ์์ ์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๊ฐ ์ด๋ฅผ ์๋์ ์ผ๋ก ์ ์ํ๊ฒ ๋ช ํํ๊ฒ ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ์๊ฒ ๋จ์ ๊ฒ์ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ์์คํ
์ ํตํด ๋ฌธ์๋ฅผ ์กฐ์ฌํ์ฌ ๋ณ๊ฒฝํ ๋งค๊ฐ๋ณ์์ ๋ฒ์๋ฅผ ์์๋ด๋ ๊ฒ๋ฟ์
๋๋ค.
๋ํ ์ ํํ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ์ ์ ์ ์์คํ
๊ณผ ํจ๊ป ์๋ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ฝ๋๋ฅผ ์ฝ๋ฉํฉ๋๋ค.
์ด์ ์ฝ๋์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์์์ ์๊ธฐํ๊ฑด๋ฐ cran-r
์ฆ, ๋ง์ถคํ ์์คํ
์ ์ฌ์ฉํ ๋ชจ๋ ์กฐ์์ R ์คํฌ๋ฆฝํธ ํ์์ผ๋ก ์กฐ์ ๋ฉ๋๋ค.
์ค์ ์์
, ๋ถ์, ๋ฉํธ๋ฆญ ๊ฐ๋ณ ์ ํ, ์์คํ
์ํ ๋ฒกํฐ: ํจํค์ง์
๋๋ค. GA
(
์ด ๊ฒฝ์ฐ ํจํค์ง๋ ๋ฒกํฐ(ํจํค์ง ์ธก๋ฉด์์ ์ผ์์ฒด)๊ฐ ์์ ๋ถ๋ถ์ด ํฌํจ๋ ์ซ์ ๋ฌธ์์ด ํ์์ผ๋ก ์ง์ ๋ ๊ฒ์ผ๋ก ์์ํ๋ค๋ ์ ์์ ๊ทธ๋ค์ง ์ ํฉํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ด ๋ฒกํฐ๋ ์ ์์ ๋ฌธ์์ด ๊ฐ์ 14๊ฐ ์๋์ ๋๋ค.
๋ฌผ๋ก ๋ฌธ์ ๋ ๋ฌธ์์ด ๊ฐ์ ํน์ ์ซ์๋ฅผ ํ ๋นํ๋ฉด ์ฝ๊ฒ ํผํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ฒฐ๊ตญ R ์คํฌ๋ฆฝํธ์ ์ฃผ์ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
GA::ga์ ์ ํํ๊ธฐ
cat( "", file=v_logfile, sep="n", append=F)
pSize = 10
elitism_value=1
pmutation_coef=0.8
pcrossover_coef=0.1
iterations=50
gam=GA::ga(type="real-valued", fitness=evaluate,
lower=c(32,2, 1,1,1,2,60,1,30,1,0,0, 0,0), upper=c(1024,32, 8,10,10,128,800,4,300,8,10,40, 40,30),
popSize=pSize,
pcrossover = pcrossover_coef,
pmutation = pmutation_coef,
maxiter=iterations,
run=4,
keepBest=T)
cat( "GA-session is done" , file=v_logfile, sep="n", append=T)
gam@solution
์ฌ๊ธฐ์ ๋์์ ๋ฐ์ lower
ะธ upper
์๋ธ๋ฃจํด ์์ฑ ga
๋ณธ์ง์ ์ผ๋ก ๊ฒ์ ๊ณต๊ฐ์ ์์ญ์ด ์ง์ ๋๋ฉฐ, ๊ทธ ์์ญ ๋ด์์ ์ ํฉ์ฑ ํจ์์ ์ต๋๊ฐ์ ์ป์ ์ ์๋ ๋ฒกํฐ(๋๋ ๋ฒกํฐ๋ค)์ ๋ํด ๊ฒ์์ด ์ํ๋ฉ๋๋ค.
ga ์๋ธ๋ฃจํด์ ์ ํฉ์ฑ ํจ์๋ฅผ ์ต๋ํํ๋ ๊ฒ์์ ์ํํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๊ฒฝ์ฐ ๋ฒกํฐ๋ฅผ subd์ ํน์ ๋งค๊ฐ๋ณ์์ ๋ํ ๊ฐ ์ธํธ๋ก ์ดํดํ๋ ์ ํฉ์ฑ ํจ์๊ฐ subd๋ก๋ถํฐ ๋ฉํธ๋ฆญ์ ์์ ํด์ผ ํ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค.
์ฆ, ์ฃผ์ด์ง subd ์ค์ ๊ณผ subd์ ๋ํ ์ฃผ์ด์ง ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ง๋ ๋ง์ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํฉ๋๊น? subd๋ ์ด๋น ํธ๋์ญ์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ฆ, ํผ์น ๋ ํผํธ๋์ค ํจ์ ๋ด์์ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
- ์ซ์์ ์ ๋ ฅ ๋ฒกํฐ ์ฒ๋ฆฌ - ์ด๋ฅผ ํ์ ๋ฐ์ดํฐ ๋งค๊ฐ๋ณ์์ ๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค.
- ์ฃผ์ด์ง ํฌ๊ธฐ์ ์ฃผ์ด์ง ์์ ๋ฆฌ๋ ๊ทธ๋ฃน์ ์์ฑํ๋ ค๋ ์๋์
๋๋ค. ๊ฒ๋ค๊ฐ ๊ทธ ์๋๊ฐ ์คํจํ ์๋ ์๋ค.
์คํ์ ์์์ฑ์ ์ํด ์ด๋ฏธ ํ์ ๊ทธ๋ฃน์ ์ด๋ ์ ๋ ์๋๊ณผ ๊ท๋ชจ๋ก ์กด์ฌํ๋ ์ก์ง ๊ทธ๋ฃน - d.b. ์ญ์ ๋์์ต๋๋ค. - ์ด์ ์ง์ ์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ: ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ (์ญ์: ์คํจํ ์ ์์)
- ์ด์ ๋จ๊ณ๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ: subd๋ฅผ ์ค์งํ๊ณ ์๋ก ์ง์ ๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ด ์ ์ฉ๋๋๋ก subd๋ฅผ ์์ํฉ๋๋ค. (๋ค์ ๋งํ์ง๋ง, ์ค๋ฅ๊ฐ ์์ ์ ์์ต๋๋ค)
- ์ด์ ๋จ๊ณ๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ: ๋ถํ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค. subd์์ ์ธก์ ํญ๋ชฉ์ ๊ฐ์ ธ์ต๋๋ค.
- ํ์ ํญ๋ชฉ์ ์๋ ์ํ๋ก ๋๋๋ฆฝ๋๋ค. ์ฆ, ์ถ๊ฐ ๋ก๊ทธ ๊ทธ๋ฃน์ ์ญ์ ํ๊ณ ์๋ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ์ ๋ค์ ์๋์ํค์ธ์.
ํผํธ๋์ค ๊ธฐ๋ฅ ์ฝ๋
evaluate=function(p_par) {
v_module="evaluate"
v_metric=0
opn=NULL
opn$rg_size=round(p_par[1],digit=0)
opn$rg_count=round(p_par[2],digit=0)
opn$log_archive_max_processes=round(p_par[3],digit=0)
opn$commit_logging="BATCH"
if ( round(p_par[4],digit=0) > 5 ) {
opn$commit_logging="IMMEDIATE"
}
opn$commit_logging=paste("'", opn$commit_logging, "'",sep="")
opn$commit_wait="WAIT"
if ( round(p_par[5],digit=0) > 5 ) {
opn$commit_wait="NOWAIT"
}
opn$commit_wait=paste("'", opn$commit_wait, "'",sep="")
opn$log_buffer=paste(round(p_par[6],digit=0),"m",sep="")
opn$log_checkpoint_timeout=round(p_par[7],digit=0)
opn$db_writer_processes=round(p_par[8],digit=0)
opn$undo_retention=round(p_par[9],digit=0)
opn$transactions_per_rollback_segment=round(p_par[10],digit=0)
opn$disk_asynch_io="true"
if ( round(p_par[11],digit=0) > 5 ) {
opn$disk_asynch_io="false"
}
opn$filesystemio_options="none"
if ( round(p_par[12],digit=0) > 10 && round(p_par[12],digit=0) <= 20 ) {
opn$filesystemio_options="setall"
}
if ( round(p_par[12],digit=0) > 20 && round(p_par[12],digit=0) <= 30 ) {
opn$filesystemio_options="directIO"
}
if ( round(p_par[12],digit=0) > 30 ) {
opn$filesystemio_options="asynch"
}
opn$db_block_checking="OFF"
if ( round(p_par[13],digit=0) > 10 && round(p_par[13],digit=0) <= 20 ) {
opn$db_block_checking="LOW"
}
if ( round(p_par[13],digit=0) > 20 && round(p_par[13],digit=0) <= 30 ) {
opn$db_block_checking="MEDIUM"
}
if ( round(p_par[13],digit=0) > 30 ) {
opn$db_block_checking="FULL"
}
opn$db_block_checksum="OFF"
if ( round(p_par[14],digit=0) > 10 && round(p_par[14],digit=0) <= 20 ) {
opn$db_block_checksum="TYPICAL"
}
if ( round(p_par[14],digit=0) > 20 ) {
opn$db_block_checksum="FULL"
}
v_vector=paste(round(p_par[1],digit=0),round(p_par[2],digit=0),round(p_par[3],digit=0),round(p_par[4],digit=0),round(p_par[5],digit=0),round(p_par[6],digit=0),round(p_par[7],digit=0),round(p_par[8],digit=0),round(p_par[9],digit=0),round(p_par[10],digit=0),round(p_par[11],digit=0),round(p_par[12],digit=0),round(p_par[13],digit=0),round(p_par[14],digit=0),sep=";")
cat( paste(v_module," try to evaluate vector: ", v_vector,sep="") , file=v_logfile, sep="n", append=T)
rc=make_additional_rgroups(opn)
if ( rc!=0 ) {
cat( paste(v_module,"make_additional_rgroups failed",sep="") , file=v_logfile, sep="n", append=T)
return (0)
}
v_rc=0
rc=set_db_parameter("log_archive_max_processes", opn$log_archive_max_processes)
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("commit_logging", opn$commit_logging )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("commit_wait", opn$commit_wait )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("log_buffer", opn$log_buffer )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("log_checkpoint_timeout", opn$log_checkpoint_timeout )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("db_writer_processes", opn$db_writer_processes )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("undo_retention", opn$undo_retention )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("transactions_per_rollback_segment", opn$transactions_per_rollback_segment )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("disk_asynch_io", opn$disk_asynch_io )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("filesystemio_options", opn$filesystemio_options )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("db_block_checking", opn$db_block_checking )
if ( rc != 0 ) { v_rc=1 }
rc=set_db_parameter("db_block_checksum", opn$db_block_checksum )
if ( rc != 0 ) { v_rc=1 }
if ( rc!=0 ) {
cat( paste(v_module," can not startup db with that vector of settings",sep="") , file=v_logfile, sep="n", append=T)
rc=stop_db("immediate")
rc=create_spfile()
rc=start_db("")
rc=remove_additional_rgroups(opn)
return (0)
}
rc=stop_db("immediate")
rc=start_db("")
if ( rc!=0 ) {
cat( paste(v_module," can not startup db with that vector of settings",sep="") , file=v_logfile, sep="n", append=T)
rc=stop_db("abort")
rc=create_spfile()
rc=start_db("")
rc=remove_additional_rgroups(opn)
return (0)
}
rc=run_test()
v_metric=getmetric()
rc=stop_db("immediate")
rc=create_spfile()
rc=start_db("")
rc=remove_additional_rgroups(opn)
cat( paste("result: ",v_metric," ",v_vector,sep="") , file=v_logfile, sep="n", append=T)
return (v_metric)
}
์ ๊ฒ. ๋ชจ๋ ์์ : ํผํธ๋์ค ๊ธฐ๋ฅ์์ ์ํ๋ฉ๋๋ค.
ga-์๋ธ๋ฃจํด์ ๋ฒกํฐ, ๋ ์ ํํ๊ฒ๋ ์ผ์์ฒด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ ํฉ๋ ํจ์๊ฐ ํฐ ๊ฐ์ ์์ฑํ๋ ์ ์ ์๋ฅผ ๊ฐ์ง ์ผ์์ฒด๋ฅผ ์ ํํ๋ ๊ฒ์
๋๋ค.
์ด๋ ๋ณธ์ง์ ์ผ๋ก N์ฐจ์ ํ์๊ณต๊ฐ์์ ๋ฒกํฐ๋ฅผ ์ด์ฉํ์ฌ ์ต์ ์ ์ผ์์ฒด ์งํฉ์ ์ฐพ๋ ๊ณผ์ ์ด๋ค.
๋งค์ฐ ๋ช
ํํ๊ณ ์์ธํจ
๋ ๊ฐ์ง ๊ธฐ์ ์ ์ฌํญ์ ๋ณ๋๋ก ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค.
ํจ์์ ๋ณด์กฐ ํธ์ถ evaluate
์๋ฅผ ๋ค์ด, subd ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ค์ ํ๋ stop-start๋ ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ์ํ๋ฉ๋๋ค. cran-r
๊ธฐ๋ฅ system2
๋์์ ๋ฐ์ ์ผ๋ถ bash ์คํฌ๋ฆฝํธ ๋๋ ๋ช ๋ น์ด ํธ์ถ๋ฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค
set_db_๋งค๊ฐ๋ณ์
set_db_parameter=function(p1, p2) {
v_module="set_db_parameter"
v_cmd="/home/oracle/testingredotracะต/set_db_parameter.sh"
v_args=paste(p1," ",p2,sep="")
x=system2(v_cmd, args=v_args, stdout=T, stderr=T, wait=T)
if ( length(attributes(x)) > 0 ) {
cat(paste(v_module," failed with: ",attributes(x)$status," ",v_cmd," ",v_args,sep=""), file=v_logfile, sep="n", append=T)
return (attributes(x)$status)
}
else {
cat(paste(v_module," ok: ",v_cmd," ",v_args,sep=""), file=v_logfile, sep="n", append=T)
return (0)
}
}
๋ ๋ฒ์งธ ํฌ์ธํธ๋ ์ ์
๋๋ค. evaluate
ํน์ ๋ฉํธ๋ฆญ ๊ฐ๊ณผ ํด๋น ํ๋ ๋ฒกํฐ๋ฅผ ๋ก๊ทธ ํ์ผ์ ์ ์ฅํ๋ ๊ธฐ๋ฅ:
cat( paste("result: ",v_metric," ",v_vector,sep="") , file=v_logfile, sep="n", append=T)
์ด๋ ์ด ๋ฐ์ดํฐ ๋ฐฐ์ด์์ ํ๋ ๋ฒกํฐ์ ์ด๋ค ๊ตฌ์ฑ ์์๊ฐ ๋ฉํธ๋ฆญ ๊ฐ์ ๋ ํฌ๊ฑฐ๋ ์์ ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค.
์ฆ, ์์ฑ-์ค์๋ ๋ถ์์ด ๊ฐ๋ฅํด์ง๋ค.
๊ทธ๋ฌ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ ์๋์?
๊ทธ๋ํ ํ์์์ ํ ์คํธ๋ฅผ ๋ฉํธ๋ฆญ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉด ๊ทธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ธก์ ํญ๋ชฉ์ ๊ทน๊ฐ์ ํด๋นํ๋ ์ผ๋ถ ๋ฐ์ดํฐ:
์ฌ๊ธฐ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ ์คํฌ๋ฆฐ์ท์์ ๋ช
ํํ ํ๊ฒ ์ต๋๋ค. ํ๋ ๋ฒกํฐ์ ๊ฐ์ ๊ณต์ํ๋ ๋งค๊ฐ๋ณ์ ์ ๋ชฉ๋ก/๋งค๊ฐ๋ณ์ ๊ฐ ๋ฒ์๊ฐ ์๋๋ผ ์ ํฉ์ฑ ํจ์ ์ฝ๋ ์ธก๋ฉด์์ ์ ๊ณต๋ฉ๋๋ค. ์์ ํ
์คํธ์์.
์. ๋ง๋์, ์ ๋์, ~8 tps: ๋ณ๋์ ์ง๋ฌธ์
๋๋ค.
์คํ์ค ์์
์ ํ ๋ด์์ ์ด ์์น๋ ์ค์ํ์ง ์์ต๋๋ค. ์ค์ํ ๊ฒ์ ์ญํ, ์ด ๊ฐ์ด ์ด๋ป๊ฒ ๋ณํ๋๊ฐ์
๋๋ค.
์ฌ๊ธฐ์ ์ญํ์ ์ข์ต๋๋ค.
์ ์ด๋ ํ๋์ ์์๊ฐ ์ผ์์ฒด ๋ฒกํฐ๋ฅผ ์ ๋ ฌํ๋ ga ์๊ณ ๋ฆฌ์ฆ์ธ ๋ฉํธ๋ฆญ ๊ฐ์ ์๋นํ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ด ๋ถ๋ช
ํฉ๋๋ค.
๊ณก์ ๊ฐ์ ์๋นํ ํ๋ฐํ ์ญํ์ผ๋ก ํ๋จํ๋ฉด ๋น๋ก ํจ์ฌ ์์ง๋ง ์ํฅ์ ๋ฏธ์น๋ ์์๊ฐ ํ๋ ์ด์ ๋ ์์ต๋๋ค.
์ฌ๊ธฐ๊ฐ ๋น์ ์๊ฒ ํ์ํ ๊ณณ์ด์์ attribute-importance
๋ถ์์ ํตํด ์ด๋ค ์์ฑ(์ด ๊ฒฝ์ฐ์๋ ํ๋ ๋ฒกํฐ์ ๊ตฌ์ฑ ์์)๊ณผ ํด๋น ์์ฑ์ด ๋ฉํธ๋ฆญ ๊ฐ์ ์ผ๋ง๋ ์ํฅ์ ๋ฏธ์น๋์ง ์ดํดํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ณด๋ฅผ ํตํด ์ค์ํ ์์ฑ์ ๋ณํ๋ก ์ด๋ค ์์ธ์ด ์ํฅ์ ๋ฐ์๋์ง ์ดํดํฉ๋๋ค.
๋ฌ๋ฆฌ๊ธฐ attribute-importance
๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฌํ ๋ชฉ์ ์ ์ํด ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ข์ํฉ๋๋ค randomForest
๊ฐ์ ์ด๋ฆ์ R ํจํค์ง(
randomForest
, ๋๋ ๊ทธ์ ์ผ๋ฐ์ ์ธ ์์
๊ณผ ํนํ ์์ฑ์ ์ค์์ฑ์ ํ๊ฐํ๋ ๊ทธ์ ์ ๊ทผ ๋ฐฉ์์ ์ดํดํ๋ฉด์ ์์ฑ์ ๋ํ ์๋ต ๋ณ์์ ์์กด์ฑ์ ๋ํ ํน์ ๋ชจ๋ธ์ ๊ตฌ์ถํฉ๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์๋ต ๋ณ์๋ ๋ถํ ํ
์คํธ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ป์ ์ธก์ ํญ๋ชฉ์
๋๋ค. tps
;
์์ฑ์ ํ๋ ๋ฒกํฐ์ ๊ตฌ์ฑ ์์์
๋๋ค.
๊ทธ๋์ randomForest
๋ ๊ฐ์ง ์ซ์๋ก ๊ฐ ๋ชจ๋ธ ์์ฑ์ ์ค์์ฑ์ ํ๊ฐํฉ๋๋ค. %IncMSE
โ ๋ชจ๋ธ์์ ์ด ์์ฑ์ ์กด์ฌ/๋ถ์ฌ๊ฐ ์ด ๋ชจ๋ธ์ MSE ํ์ง์ ์ด๋ป๊ฒ ๋ณ๊ฒฝํ๋์ง(ํ๊ท ์ ๊ณฑ ์ค์ฐจ)
๊ทธ๋ฆฌ๊ณ IncNodePurity๋ ์ด ์์ฑ์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ด์ธก๊ฐ์ด ์๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ผ๋ง๋ ์ ๋๋ ์ ์๋์ง๋ฅผ ๋ฐ์ํ๋ ์ซ์์
๋๋ค. ์ฆ, ํ ๋ถ๋ถ์๋ ์ค๋ช
๋๋ ๋ฉํธ๋ฆญ์ ํ ๊ฐ์ด ์๋ ๋ฐ์ดํฐ๊ฐ ์๊ณ ๋ค๋ฅธ ๋ถ๋ถ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค. ์ธก์ ํญ๋ชฉ์ ๋ค๋ฅธ ๊ฐ์
๋๋ค.
๊ธ์, ์ฆ, ์ด๊ฒ์ด ์ด๋ ์ ๋๊น์ง ๋ถ๋ฅ ์์ฑ์ธ๊ฐ(RandomForest์์ ๊ฐ์ฅ ๋ช
ํํ ๋ฌ์์์ด ์ค๋ช
์ ๋ณด์์ต๋๋ค)
๋ถํ ํ ์คํธ ๊ฒฐ๊ณผ๋ก ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ ธ๋์-๋๋ฏผ R ์ฝ๋:
x=NULL
v_data_file=paste('/tmp/data1.dat',sep="")
x=read.table(v_data_file, header = TRUE, sep = ";", dec=",", quote = ""'", stringsAsFactors=FALSE)
colnames(x)=c('metric','rgsize','rgcount','lamp','cmtl','cmtw','lgbffr','lct','dbwrp','undo_retention','tprs','disk_async_io','filesystemio_options','db_block_checking','db_block_checksum')
idxTrain=sample(nrow(x),as.integer(nrow(x)*0.7))
idxNotTrain=which(! 1:nrow(x) %in% idxTrain )
TrainDS=x[idxTrain,]
ValidateDS=x[idxNotTrain,]
library(randomForest)
#mtry=as.integer( sqrt(dim(x)[2]-1) )
rf=randomForest(metric ~ ., data=TrainDS, ntree=40, mtry=3, replace=T, nodesize=2, importance=T, do.trace=10, localImp=F)
ValidateDS$predicted=predict(rf, newdata=ValidateDS[,colnames(ValidateDS)!="metric"], type="response")
sum((ValidateDS$metric-ValidateDS$predicted)^2)
rf$importance
์๊ณ ๋ฆฌ์ฆ์ ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์์ผ๋ก ์ง์ ์ ํํ ์ ์์ผ๋ฉฐ, ๋ชจ๋ธ์ ํ์ง์ ์ค์ ์ ๋๊ณ ๊ฒ์ฆ ๋ฐ์ดํฐ ์ธํธ์ ๋ํ ์์ธก์ ๋ณด๋ค ์ ํํ๊ฒ ์ถฉ์กฑํ๋ ๋ชจ๋ธ์ ์ ํํ ์ ์์ต๋๋ค.
์ด ์์
์ ์ํด ์ผ์ข
์ ํจ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค(๊ทธ๋ฐ๋ฐ, ์ผ์ข
์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ค์ ๋งํ์ง๋ง).
R ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค caret
, ์์ ์ ์ค์ํ์ง ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, ์ด ๊ฒฝ์ฐ ์์ฑ์ ์ค์๋๋ฅผ ํ๊ฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ป์ด์ก๋ค.
์. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ ์ญ ๋ฐ์์ ์์ํ ์ ์์ต๋๋ค.
- ์ด๋ฌํ ํ
์คํธ ์กฐ๊ฑด์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋งค๊ฐ๋ณ์์์ต๋๋ค.
commit_wait
๊ธฐ์ ์ ์ผ๋ก ์ด๋ subdb ๋ก๊ทธ ๋ฒํผ์ ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฌ ๋ก๊ทธ ๊ทธ๋ฃน์ ์ฐ๊ธฐ ์ํ io ์์ ์ ์คํ ๋ชจ๋(๋๊ธฐ ๋๋ ๋น๋๊ธฐ)๋ฅผ ์ง์ ํฉ๋๋ค.
๊ฐ์นnowait
์ด๋ tps ๋ฉํธ๋ฆญ ๊ฐ์ด ๊ฑฐ์ ์์ง์ผ๋ก ์ฌ๋ฌ ๋ฒ ์ฆ๊ฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ด๋ ๋ค์ ์คํ ๊ทธ๋ฃน์ ๋น๋๊ธฐ io ๋ชจ๋๋ฅผ ํฌํจ์ํค๋ ๊ฒ์ ๋๋ค.
๋ณ๋์ ์ง๋ฌธ์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ด ์์ ์ ์ํํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ด๊ฒ์ด ์ค์ํ ์์๋ผ๋ ์ ๋ง ์ธ๊ธํ๊ฒ ์ต๋๋ค. - subd:์ ๋ก๊ทธ ๋ฒํผ ํฌ๊ธฐ๊ฐ ์ค์ํ ์์์ธ ๊ฒ์ ๋
ผ๋ฆฌ์ ์
๋๋ค.
๋ก๊ทธ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ์์์๋ก ๋ฒํผ๋ง ์ฉ๋์ด ์์์ง๊ณ ์ค๋ฒํ๋ก๊ฐ ๋ ์์ฃผ ๋ฐ์ํ๋ฉฐ/๋๋ ์๋ก์ด ์ฐํํ์ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ์ํด ์ฌ์ ๊ณต๊ฐ์ ํ ๋นํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด๋ ๋ก๊ทธ ๋ฒํผ์ ๊ณต๊ฐ ํ ๋น ๋ฐ/๋๋ ๋ก๊ทธ ๋ฒํผ์ ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ๋ ๊ทธ๋ฃน์ผ๋ก ๋คํํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ง์ฐ์ ์๋ฏธํฉ๋๋ค.
๋ฌผ๋ก ์ด๋ฌํ ์ง์ฐ์ ํธ๋์ญ์ ์ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ๋์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. - ๋งค๊ฐ ๋ณ์
db_block_checksum
: ๊ธ์์, ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ๋ก ์ธํด ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฒํผ ์บ์์ ๋คํฐ ๋ธ๋ก์ด ํ์ฑ๋๋ค๋ ์ ์ ๋ถ๋ช ํฉ๋๋ค.
๋ฐ์ดํฐ ๋ธ๋ก์ ์ฒดํฌ์ฌ ํ์ธ์ด ํ์ฑํ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ๋ธ๋ก ๋ณธ๋ฌธ์์ ์ด๋ฌํ ์ฒดํฌ์ฌ์ ๊ณ์ฐํ๊ณ ๋ฐ์ดํฐ ๋ธ๋ก ํค๋์ ๊ธฐ๋ก๋ ๋ด์ฉ(์ผ์น/์ผ์นํ์ง ์์)์ผ๋ก ํ์ธํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์์ ์ ์ญ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ฐ์ํฌ ์ ์์ผ๋ฉฐ ๋ฐ๋ผ์ ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๋ ๋งค๊ฐ๋ณ์์ ๋ฉ์ปค๋์ฆ์ด ์ค์ํ ๊ฒ์ผ๋ก ๋ํ๋ฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ณต๊ธ์ ์ฒด๋ ์ด ๋งค๊ฐ๋ณ์์ ๋ํ ๋ฌธ์์์ ํด๋น ๋งค๊ฐ๋ณ์์ ๋ํด ๋ค๋ฅธ ๊ฐ์ ์ ๊ณตํ๊ณ ์ํฅ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์ธ๊ธํฉ๋๋ค. ํ์ง๋ง "off" ๋ฐ "off"๊น์ง ๋ค๋ฅธ ๊ฐ์ ์ ํํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ํฅ.
๊ธ์์, ์ธ๊ณ์ ์ธ ๊ฒฐ๋ก ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฝค ํจ๊ณผ์ ์ธ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๊ทธ๋ ํน์ ์๋น์ค ์์คํ ์ ๋ก๋ ํ ์คํธ ์ด๊ธฐ ๋จ๊ณ์์ ๋ก๋์ ๋ํ ์์คํ ์ค์ ์ ์ธ๋ถ ์ฌํญ์ ๋๋ฌด ๋ง์ด ํ๊ตฌํ์ง ์๊ณ ๋ก๋์ ๋ํ ์ต์ ์ ๊ตฌ์ฑ(์์คํ )์ ์ ํํ๊ธฐ ์ํด ์ค์ค๋ก๋ฅผ ํ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ต์ํ ์ดํด ์์ค์์๋ ์ด๋ฅผ ์์ ํ ๋ฐฐ์ ํ์ง๋ ์์ต๋๋ค. ์์คํ ์ "์กฐ์ ์์ก์ด"์ ์ด๋ฌํ ์์ก์ด์ ํ์ฉ ํ์ ๋ฒ์์ ๋ํด ์์์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด ์ต์ ์ ์์คํ
๊ตฌ์ฑ์ ์๋์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์์คํ
์ฑ๋ฅ ์งํ์ ์์คํ
์ค์ ๋งค๊ฐ๋ณ์ ๊ฐ ๊ฐ์ ๊ด๊ณ ํน์ฑ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ฌผ๋ก ์ด๋ ์ ์ด๋ ์ฃผ์ด์ง ๋ถํ ํ์์ ์์คํ ๊ณผ ์๋์ ๋ํ ๋งค์ฐ ๊น์ ์ดํด์ ์ถํ์ ๊ธฐ์ฌํด์ผ ํฉ๋๋ค.
์ค์ ๋ก ์ด๋ ๋ง์ถคํ ์์คํ ์ ์ดํดํ๋ ๋ฐ ๋๋ ๋น์ฉ์ ์์คํ ํ ์คํธ๋ฅผ ์ค๋นํ๋ ๋ฐ ๋๋ ๋น์ฉ์ผ๋ก ๊ตํํ๋ ๊ฒ์ ๋๋ค.
์ ๋ ๋ณ๋๋ก ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์์๋ ์์ ์ ์ด์์์ ๊ฐ๊ฒ ๋ ์ด์ ์กฐ๊ฑด์ ๋ํ ์์คํ ํ ์คํธ์ ์ ์ ์ฑ ์ ๋๊ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ทํ์ ๊ด์ฌ๊ณผ ์๊ฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ถ์ฒ : habr.com