์ด ๊ธฐ์ฌ์์๋ I/O ํ์ ์์คํ
์ ๋ช ๊ฐ์ง ๋ฏธ๋ฌํ ์ฐจ์ด์ ์ด๊ฒ์ด ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ช ์ฃผ ์ ์ ํ ์๋ฒ์ NVMe๊ฐ ๋ค๋ฅธ ์๋ฒ์ SATA๋ณด๋ค ๋๋ฆฐ ์ด์ ์ ๋ํ ์ง๋ฌธ์ ๋ฐ์์ต๋๋ค. ์๋ฒ์ ํน์ฑ์ ์ดํด๋ณด๋ NVMe๋ ์ฌ์ฉ์ ๋ถ๋ฌธ์์, SSD๋ ์๋ฒ ๋ถ๋ฌธ์์ ํก์ค์์คํ ์ง๋ฌธ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
๋ถ๋ช
ํ, ์๋ก ๋ค๋ฅธ ํ๊ฒฝ์์ ์๋ก ๋ค๋ฅธ ๋ถ๋ฌธ์ ์ ํ์ ๋น๊ตํ๋ ๊ฒ์ ์ณ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์์ ํ ๊ธฐ์ ์ ๋ต๋ณ์ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ์ด๋ฅผ ์ฐ๊ตฌํ๊ณ , ์คํ์ ์ํํ๊ณ , ์ ๊ธฐ๋ ์ง๋ฌธ์ ๋ตํ ๊ฒ์
๋๋ค.
fsync ๋ ๋ฌด์์ด๋ฉฐ ์ด๋์ ์ฌ์ฉ๋ฉ๋๊น?
๋๋ผ์ด๋ธ ์์ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ฐ์ดํฐ๋ ๋ฒํผ๋ง๋ฉ๋๋ค. ์ฆ, ๋ฒํผ ๋ด์ฉ์ ๋๋ผ์ด๋ธ์ ์ ์ฅํ ์ ์๋ ํธ๋ฆฌํ ๊ธฐํ๊ฐ ๋ํ๋ ๋๊น์ง ํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ฉ๋๋ค. ๊ธฐํ ๊ธฐ์ค์ ์ด์ ์ฒด์ ๋ฐ ๋๋ผ์ด๋ธ ํน์ฑ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ์ ์ ์ด ๋ฐ์ํ๋ฉด ๋ฒํผ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ค๋ฉ๋๋ค.
ํ์ผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ผ์ด๋ธ์ ๊ธฐ๋ก๋๊ณ ์ค๊ฐ ๋ฒํผ์ ์์ง ์์์ง ํ์ธํด์ผ ํ๋ ์ฌ๋ฌ ์์ ์ด ์์ต๋๋ค. ์ด ๋ณด์ฆ์ POSIX ํธํ fsync ์์คํ ํธ์ถ์ ์ฌ์ฉํ์ฌ ์ป์ ์ ์์ต๋๋ค. fsync ํธ์ถ์ ๋ฒํผ์์ ๋๋ผ์ด๋ธ๋ก ๊ฐ์ ๋ก ์ฐ๊ธฐ๋ฅผ ์ํํฉ๋๋ค.
์งง์ C ํ๋ก๊ทธ๋จ ํํ์ ์ธ์์ ์ธ ์์ ๋ฅผ ํตํด ๋ฒํผ์ ํจ๊ณผ๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(void) {
/* ะัะบััะฒะฐะตะผ ัะฐะนะป answer.txt ะฝะฐ ะทะฐะฟะธัั, ะตัะปะธ ะตะณะพ ะฝะตั -- ัะพะทะดะฐัะผ */
int fd = open("answer.txt", O_WRONLY | O_CREAT);
/* ะะฐะฟะธััะฒะฐะตะผ ะฟะตัะฒัะน ะฝะฐะฑะพั ะดะฐะฝะฝัั
*/
write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
/* ะะตะปะฐะตะผ ะฒะธะด, ััะพ ะฟัะพะฒะพะดะธะผ ะฒััะธัะปะตะฝะธั ะฒ ัะตัะตะฝะธะต 10 ัะตะบัะฝะด */
sleep(10);
/* ะะฐะฟะธััะฒะฐะตะผ ัะตะทัะปััะฐั ะฒััะธัะปะตะฝะธะน */
write(fd, "42n", 3);
return 0;
}
์ฃผ์์ ํ๋ก๊ทธ๋จ์ ๋์ ์์๋ฅผ ์ ์ค๋ช ํฉ๋๋ค. "์ธ์, ์ฐ์ฃผ ๋ฐ ๊ทธ ๋ชจ๋ ๊ฒ์ ๋ํ ์ฃผ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ"์ด๋ผ๋ ํ ์คํธ๋ ์ด์ ์ฒด์ ์ ์ํด ๋ฒํผ๋ง๋๋ฉฐ "๊ณ์ฐ" ์ค์ ์ฌ์ค์ ๋ฒํผ์ ๋๋ฌ ์๋ฒ๋ฅผ ๋ค์ ์์ํ๋ฉด ํ์ผ์ด ๋น์ด ์๊ฒ ๋ฉ๋๋ค. ์ด ์์์๋ ํ ์คํธ ์์ค์ด ๋ฌธ์ ๊ฐ ๋์ง ์์ผ๋ฏ๋ก fsync๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ด๋ฌํ ๋๊ด๋ก ์ ๊ณต์ ํ์ง ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์์ ๋ง์ ํ์ผ์ ์์ ํ๋ ๋ณต์กํ ํ๋ก๊ทธ๋จ์ด๋ฏ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ์ด์ ๋ฌ๋ ค ์๊ธฐ ๋๋ฌธ์ ์์ฑํ ๋ฐ์ดํฐ๊ฐ ๋๋ผ์ด๋ธ์ ์ ์ฅ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ฃ๋ ๋ชจ๋ ํธ๋์ญ์ ์ ๊ธฐ๋กํ๊ณ ์ธ์ ๋ ์ง ์ ์ ์ ๋๋นํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด ๋์์ผ๋ก ์ธํด fsync๋ฅผ ์ง์์ ์ผ๋ก ๋๋์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค.
fsync์ ๋น๋ฒํ ์ฌ์ฉ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ
์ผ๋ฐ I/O์์๋ ์ธ๋ถ ๋๋ผ์ด๋ธ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ์์ ๊ฐ์ฅ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ด์ ์ฒด์ ๋ ๋์คํฌ ํต์ ์ ์ต์ ํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ์ฒด์ ๋ ๋๋ผ์ด๋ธ์ ๋ํ ํ ๋ฒ์ ์ก์ธ์ค๋ก ๊ฐ๋ฅํ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ค๊ณ ํฉ๋๋ค.
๊ตฌ์ฒด์ ์ธ ์๋ฅผ ๋ค์ด fsync ์ฌ์ฉ์ด ๋ฏธ์น๋ ์ํฅ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ ์คํธ ๋์์ผ๋ก ๋ค์๊ณผ ๊ฐ์ SSD๊ฐ ์์ต๋๋ค.
- Intelยฎ DC SSD S4500 480GB, SATA 3.2๋ฅผ ํตํด ์ฐ๊ฒฐ, 6Gb/s;
- Samsung 970 EVO Plus 500GB, PCIe 3.0 x4, ~31Gbps๋ฅผ ํตํด ์ฐ๊ฒฐ๋จ.
ํ ์คํธ๋ Ubuntu 2255๋ฅผ ์คํํ๋ Intelยฎ Xeonยฎ W-20.04์์ ์ํ๋์์ต๋๋ค. ๋์คํฌ๋ฅผ ํ ์คํธํ๋ ค๋ฉด sysbench 1.0.18์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋์คํฌ์๋ ext4๋ก ํฌ๋งท๋ ๋จ์ผ ํํฐ์ ์ด ์์ต๋๋ค. ํ ์คํธ ์ค๋น๋ 100GB ํ์ผ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
sysbench --test=fileio --file-total-size=100G prepare
ํ ์คํธ ์คํ:
# ะะตะท fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run
# ะก fsync ะฟะพัะปะต ะบะฐะถะดะพะน ะทะฐะฟะธัะธ
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 run
ํ ์คํธ ๊ฒฐ๊ณผ๋ ํ์ ๋์ ์์ต๋๋ค.
ํ
์คํธ
์ธํ
ยฎ S4500
์ผ์ฑ 970 EVO+
fsync ์์ด ์ฝ๊ธฐ, MiB/s
5734.89
9028.86
fsync ์์ด ์ฐ๊ธฐ, MiB/s
3823.26
6019.24
fsync๋ก ์ฝ๊ธฐ, MiB/s
37.76
3.27
fsync, MiB/s๋ก ๋
น์
25.17
2.18
์ด์ ์ฒด์ ์์ฒด๊ฐ ๋์คํฌ ์์ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ ๋ ํด๋ผ์ด์ธํธ ์ธ๊ทธ๋จผํธ์ NVMe๊ฐ ์์ ์๊ฒ ์์๊ณ fsync๋ฅผ ์ฌ์ฉํ ๋ ํจ๋ฐฐํ๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. ์ด๋ ๋ ๊ฐ์ง ์ง๋ฌธ์ ์ ๊ธฐํฉ๋๋ค.
- fsync๋ฅผ ์ฌ์ฉํ์ง ์์ ํ ์คํธ์์ ์ฝ๊ธฐ ์๋๊ฐ ๋งํฌ์ ๋ฌผ๋ฆฌ์ ๋์ญํญ์ ์ด๊ณผํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
- ์๋ฒ ์ธ๊ทธ๋จผํธ SSD๊ฐ ๋ค์์ fsync ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ ๋์ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ ๋ํ ๋๋ต์ ๊ฐ๋จํฉ๋๋ค. sysbench๋ 100์ผ๋ก ์ฑ์์ง ํ์ผ์ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ ํ ์คํธ๋ XNUMXGB ์ด์์ ์ ๋ก๋ฅผ ์ํํ์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋งค์ฐ ๊ท ์ผํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ค์ํ OS ์ต์ ํ๊ฐ ์ ์ฉ๋์ด ์คํ ์๋๊ฐ ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
sysbench์ ๋ชจ๋ ๊ฒฐ๊ณผ์ ์๋ฌธ์ด ์๋ ๊ฒฝ์ฐ fio๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# ะะตะท fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb
# ะก fsync ะฟะพัะปะต ะบะฐะถะดะพะน ะทะฐะฟะธัะธ
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdb
ํ
์คํธ
์ธํ
ยฎ S4500
์ผ์ฑ 970 EVO+
fsync ์์ด ์ฝ๊ธฐ, MiB/s
45.5
178
fsync ์์ด ์ฐ๊ธฐ, MiB/s
30.4
119
fsync๋ก ์ฝ๊ธฐ, MiB/s
32.6
20.9
fsync, MiB/s๋ก ๋
น์
21.7
13.9
fsync๋ฅผ ์ฌ์ฉํ ๋ NVMe์ ์ฑ๋ฅ ์ ํ ์ถ์ธ๊ฐ ๋ช ํํ๊ฒ ๋ณด์ ๋๋ค. ๋ ๋ฒ์งธ ์ง๋ฌธ์ผ๋ก ๋์ด๊ฐ ์ ์์ต๋๋ค.
์ต์ ํ ๋๋ ํ์ธ
์์ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๊ฐ ๋ฒํผ์ ์ ์ฅ๋๋ค๊ณ ๋งํ์ง๋ง ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๋ฒํผ์ ์ ์ฅ๋๋์ง ์ง์ ํ์ง ์์์ต๋๋ค. ์ง๊ธ๋ ์ฐ๋ฆฌ๋ ์ด์ ์ฒด์ ์ ๋ณต์ก์ฑ์ ํ๊ตฌํ์ง ์๊ณ ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ํ์ ๋ฒํผ๋ฅผ ์ ํํ์ง ์์ ๊ฒ์ ๋๋ค.
- ํ๋ก๊ทธ๋จ;
- ํ๋์จ์ด.
์ํํธ์จ์ด ๋ฒํผ๋ ์ด์์ฒด์ ์ ์กด์ฌํ๋ ๋ฒํผ๋ฅผ ๋งํ๊ณ , ํ๋์จ์ด ๋ฒํผ๋ ๋์คํฌ ์ปจํธ๋กค๋ฌ์ ํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋งํ๋ค. fsync ์์คํ ํธ์ถ์ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง์ ๊ธฐ๋กํ๊ธฐ ์ํด ๋๋ผ์ด๋ธ์ ๋ช ๋ น์ ๋ณด๋ด์ง๋ง ๋ช ๋ น์ ์ฌ๋ฐ๋ฅธ ์คํ์ ์ ์ดํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
SSD์ ์ฑ๋ฅ์ด ๋ ์ข๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ง ๊ฐ์ ์ ํ ์ ์์ต๋๋ค.
- ๋์คํฌ๋ ์ ์ฌํ ๊ณํ์ ๋ก๋๋ฅผ ์ํด ์ค๊ณ๋์์ต๋๋ค.
- ๋์คํฌ๋ "ํ์ธ๋ฅผ ๋ถ๋ฆฌ๊ณ " ๋ช ๋ น์ ๋ฌด์ํฉ๋๋ค.
์ ์ ๋ ์ํ์์ ํ
์คํธ๋ฅผ ์ํํ๋ฉด ๋๋ผ์ด๋ธ์ ๋ถ์ ์งํ ๋์์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ์คํฌ๋ฆฝํธ๋ก ํ์ธํ ์ ์์ต๋๋ค.
์ด ์คํฌ๋ฆฝํธ์๋ "์๋ฒ"์ "ํด๋ผ์ด์ธํธ"๋ผ๋ ๋ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์์คํ ์ด ํ์ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ํ ์คํธ ์ค์ธ ๋๋ผ์ด๋ธ์ ์๋์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ , fsync๋ฅผ ํธ์ถํ๊ณ , ๊ธฐ๋ก๋ ๋ด์ฉ์ ๋ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ๋ณด๋ ๋๋ค.
# ะะฐะฟััะบะฐะตััั ะฝะฐ ัะตัะฒะตัะต
./diskchecker.pl -l [port]
# ะะฐะฟััะบะฐะตััั ะฝะฐ ะบะปะธะตะฝัะต
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ํ์๋ "ํด๋ผ์ด์ธํธ"์ ์ ์์ ์ฐจ๋จํ๊ณ ๋ช ๋ถ ๋์ ์ ์์ ๋ค์ ๊ณต๊ธํ์ง ์์์ผ ํฉ๋๋ค. ๊ฐ์ ์ข ๋ฃ๋ง ์ํํ๋ ๊ฒ์ด ์๋๋ผ ํ ์คํธ ๋์์ ์ ๊ธฐ์์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ์ ํ ์๋ฒ๊ฐ ์ฐ๊ฒฐ๋์ด OS์ ๋ก๋๋ ์ ์์ต๋๋ค. OS๋ฅผ ๋ถํ ํ ํ ๋ค์ ์์ํด์ผ ํฉ๋๋ค. diskchecker.pl, ๊ทธ๋ฌ๋ ์ธ์๊ฐ ์์ ํ์ธ.
./diskchecker.pl -s <server[:port]> verify <file>
๊ฒ์ฌ๊ฐ ๋๋๋ฉด ์ค๋ฅ ์๊ฐ ํ์๋ฉ๋๋ค. 0์ด๋ฉด ๋์คํฌ๊ฐ ํ ์คํธ๋ฅผ ํต๊ณผํ ๊ฒ์ ๋๋ค. ๋์คํฌ์ ์ฑ๊ณตํ ์ํฉ์ ์กฐํฉ์ ์ ์ธํ๊ธฐ ์ํด ์คํ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ ์ ์์ต๋๋ค.
S4500์๋ ์ ๋ ฅ ์์ค ์ค๋ฅ๊ฐ ํ์๋์ง ์์์ต๋๋ค. ์ด๋ fsync ํธ์ถ์ด ๋ง์ ๋ก๋์ ์ค๋น๊ฐ ๋์์์ ์๋ฏธํฉ๋๋ค.
๊ฒฐ๋ก
๋์คํฌ ๋๋ ๊ธฐ์ฑ ๊ตฌ์ฑ ์ ์ฒด๋ฅผ ์ ํํ ๋ ํด๊ฒฐํด์ผ ํ ์์ ์ ์ธ๋ถ ์ฌํญ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค. ์ผํ ๋ณด๋ฉด NVMe, ์ฆ PCIe ์ธํฐํ์ด์ค๋ฅผ ํ์ฌํ SSD๊ฐ 'ํด๋์' SATA SSD๋ณด๋ค ๋น ๋ฅธ ๊ฒ์ด ๋ถ๋ช ํด ๋ณด์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ ์ฐ๋ฆฌ๊ฐ ์ดํดํ ๊ฒ์ฒ๋ผ ํน์ ์กฐ๊ฑด๊ณผ ํน์ ์์ ์์๋ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค.
IaaS ๊ณต๊ธ์๋ก๋ถํฐ ์๋ํ ๋ ์๋ฒ ๊ตฌ์ฑ ์์๋ฅผ ์ด๋ป๊ฒ ํ
์คํธํฉ๋๊น?
๋๊ธ์์ ์ฌ๋ฌ๋ถ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
์ถ์ฒ : habr.com