개인 자료란 (JE)

  서버 커뮤니티

Profile wysohn 대표칭호 없음
Profile

커뮤니티 소통 개발하기 기타강좌

운영자/개발자 에게 필수인 싱글 스레드에 대한 개념 이해하기

2020.03.14 조회 수 2571 추천 수 3

안녕하세요? 오늘은 개발/운영 을 통틀어서 필수적 이라고 할 수 있는 싱글 스레드에 대한 강좌를 해보도록 하겠습니다. 왜 필수이냐? 바로 여러분이 사용하시는 스피갓/버킷/페이퍼 등이 싱글 스레드의 기반으로 돌아가기 때문입니다. 


싱글스레드가 안좋다고 말하시는분들이 많은데 이는 너무 편중된 의견인것이 많은 게임에서 싱글 스레드를 기반으로 게임을 제작합니다. 왜냐하면 싱글 스레드로 만드는게 더 쉽기 때문이죠! 그래서 관리만 잘하면 궂이 다중 스레드를 사용하는것보다 훨씬 좋습니다. 왜냐하면 멀티 스레드 자체가 숙련된 프로그래머라도 머리를 쥐어싸야 할 정도로 변수도 많고 복잡하기 때문이죠.


그럼 싱글 스레드인데 I5 I7 이런 좋은 CPU들을 쓰는게 무슨 의미가 있느냐 ? 하는 분들이 있을것인데 싱글 스레드라고 다른 코어를 활용하지 못하는것은 아닙니다! 


싱글 스레드의 특징을 알아보면서 서버를 한계까지 혹사 시켜봅니다.



먼저 여기 CPU에 대해 간단하게 알아봅시다.


CPU가 뭔가요? 적어도 컴퓨터의 두뇌에 해당한다는것은 들어 보셨을겁니다. 다만 대부분이 어떻게 동작하는지는 모르실거라 생각합니다.


물론 깊히 들어가면 끝도없지만 필수적으로 알아야하는것은 CPU는 연산 을 하는 장치 입니다.


마인크래프트 월드에 좀비가 있는데 좌표 0,0,0 부터 0,0,8 까지 가려면 어떻게 계산해야할까요? 아 물론 복잡한 알고리즘을 사용해야 할겁니다. 제가 하고싶은말은 이 알고리즘을 계산 해서 답을 내주는 곳이 바로 CPU 라는 것 입니다.



그건 알았는데 그럼 싱글 스레드의 스레드 는 뭔가요?


이 부분을 많은분들이 헷갈려 하시는데 CPU 가 작업을 처리하는것이 그냥 되는것이 아닙니다. 아시다시피 CPU는 여러가지 작업을 처리 해야하는데 CPU의 작업 처리량에는 한계가 있습니다. 


그러니 이 CPU를 사용하려면 CPU가 바쁘지않을때 기다렸다가 처리하고 기다렸다가 처리하고... 이러한 물리적인 세세한 작업이 필요하게 됩니다.


또한 코어가 1개가 아닌 위에서 언급했던 I5 I7같은 다중코어의 CPU라면 더 까다롭겠죠?


그 작업을 맡아서 해주는것이 바로 스레드 입니다.


우리는 그냥 작업1 (좀비가 좌표 이동을 하려는데 경로 계산 해줘) 을 스레드에 맡겨놓으면 스레드가 알아서 CPU 를 자유자재로 사용해서 정답을 내줍니다!



그렇기때문에! 다중코어를 충분히 활용하려면 스레드에 대한 이해가 필수 인 것 입니다. 


자 이제 싱글 스레드에 대한 이야기를 해봅시다. 싱글 스레드는 말그대로 싱글, 즉 스레드가 하나 뿐 이라는겁니다.


그럼 무엇이 문제이느냐 하는것은 스레드는 작업을 순번대로만 처리 할 수 있습니다.


예를들어 위에서 말한 작업1 (좀비 좌표) 를 처리 하려고 한다면 뭔가 복잡한 알고리즘을 계산 해야 할 것 입니다. 그런데 스레드는 작업을 순번대로만 처리 할 수 있다고 했죠?


그럼 이 작업1 이 1부터 100까지의 과정이라고 한다면 스레드는 이 과정을 1부터 100까지 하나하나 처리합니다. 즉 중간에 50을 하고 30을 하고 다시 돌아와서 2를 하고 이런것이 불가능 하다는 것 이죠.


그럼 스레드가 단 하나만 있다면 무슨 문제가 발생할까요? 바로 스레드가 대기상태에 빠지는 BLOCKING 현상이 자주 발생 하게 됩니다.



이쯤에서 드디어 마인크래프트 이야기를 해도 될거같습니다. 


우리가 주로 사용하는 서버 프로그램, 스피갓/버킷/페이퍼, 등은 모두들 잘 아시다시피 싱글 스레드 입니다.


그리고 이 프로그램들의 개발자들은 개발을 쉽게 하기위해 tick 이라는 개념을 만들었습니다. 틱이라고 들어보셨죠? /timings 치면 나오는 그겁니다. TPS 도 Ticks Per Second 즉 1초에 몇 틱이 실행되었는가를 나타내는겁니다.


다들 잘 아시겠지만 서버의 TPS 가 20일때가 가장 이상적인 환경인데 아마 이걸 정확히 이해하고 운영하시는분들은 많이 없으리라고 생각합니다. 하지만 이걸 알고 모르고는 아주 큰 관점의 변화를 생기게 합니다.


아시다시피 스레드는 작업이 1부터 100까지 있으면 한번에 하나씩밖에 처리를 못합니다. 그리고 서버의 tick 이 무엇이냐 하면 바로 이 서버의 스레드가 작동하는 반복 주기를 말합니다!


눈치 채신 분들도 있겠지만 우리가 서버에서 보는 몹의 움직임, 블록 생성, 블록 삭제, 이런 모든 동작들은 이 하나의 스레드에서 모두 처리가 됩니다. 다만 CPU가 너무 빠르기때문에 마치 동시에 발생하는 것 처럼 보이는 것 이지요.


그리고 tick 한번에는 최대 50ms (0.05초)가 사용 될 수 있습니다. 


2d32042c6d492759eb3d0e6ffc8db698.png

https://www.spigotmc.org/threads/timings-help.138867/


위는 스피갓에서 퍼온 timings 입니다. (/timings paste 로 얻을 수 있습니다.)


여기에 보시면 Full Server Tick 이 보이는데 이게 바로 우리가 이해하려고 하고있는 서버의 싱글 스레드 입니다. timings 는 즉 스레드에서 어떤작업이 실행되었고 시간을 얼마나 소비 했는지를 나타내는겁니다.


위에서 말했다시피 tick 한번에 최대 50ms가 사용 될 수 있다고 했지요? 그래서 Avg, 즉 평균갚, 이 50ms 이하 (사진에서도 44.06ms로 나오네요) 라면 TPS가 줄어들지 않고 서버를 운영 할 수 있습니다.


그리고 이 값이 50ms를 넘는 순간 TPS가 떨어지면서 서버가 렉이 걸리게 됩니다.



자 그럼 슬슬 해답에 도달 합니다. 그럼 서버가 렉이 걸리지않고 CPU를 최대한 활용 하려면 어떻게 해야하느냐?


사실 바닐라 서버는 그다지 많이 할 수 있는게 없습니다. 왜냐하면 마인크래프트의 일반적인 기능들은 우리가 접근 하기 어렵게 되어 있기 때문이지요. 그마나 작은 노오오력으로 페이퍼 같은 스피갓의 아종을 사용하면 직접 이 일반적인 과정들에 접근해서 스레드 사용량을 조금 최적화 할 수 있는 것 입니다. (예제로 깔떼기를 1tick당 아이템 하나씩 옮기는게 아닌 3tick 간격으로 3개씩 옮기기, 몹 충돌 줄이기 등등)


그것보다도 주로 문제가 되는것은 바로 플러그인 입니다. 이것에 대해서는 이후에 (작성하게 되면) 개발자 심화편에서 작성 하겠지만 간단하게 말하자면 제대로 작성되지 않은 플러그인이 많은 문제를 야기합니다.


timings에는 서버 정보만이 아닌 플러그인의 tick 사용 시간도 나옵니다. 여기서 너무 많은 ms 를 차지하는 플러그인은 잘못만들어진 플러그인일 가능성이 높고 플러그인을 업데이트 하거나 빼는것이 권장됩니다.


대표적인 예제로 WorldEdit이 있습니다. 범위를 크게하고 블록을 변경하면 서버가 잠깐 스거나 터지죠? 왜냐면 그 많은 블록을 1tick 안에 변경하느라 시간이 오래 걸리기 때문에 다른 작업들이 모두 올 스탑 중이기 때문입니다. 그래서 등장한것이 AsyncWorldEdit 인데 차이점이 바로 WorldEdit이 모든 블록을 1tick 에서 전부 처리하려고 한다면 AsyncWorldEdit은 이것을 여러 tick으로 나눠서 처리 하는 것 입니다. 잠깐 서버를 렉걸리게 하고 빠르게 처리를 하는것과 서버는 안정적이지만 처리속도는 느린것, 선택지는 여러분에게 있습니다.


아! 예외가 있다면 서버 스레드가 멈추더라도 채팅은 계속 할 수 있습니다. 채팅은 개별적인 채팅용 스레드가 따로 존재하기 때문이지요.


개발자분들을 위해 따로 설명하자면 주된 원인으로는 파일 입출력 (config.yml 등) 소켓 입출력 (인터넷 연결) 등을 이 서버 스레드에서 처리 하려고 하면 문제가 됩니다.


왜냐하면 파일 입출력이나 소켓 입출력은 속도가 매우 느린데 (10mb 짜리 사진만 받으려고 해도 적어도 1s는 걸릴껍니다. 무려 1000ms입니다!) 이것을 서버 스레드에서 처리하게 한다면 입출력이 끝날때까지 다른 작업들 (몹 이동, 블록 파괴, 등등) 이 모두 올 스탑 하게 됩니다. TPS가 떨어지는건 덤이구요. 채팅용 스레드가 따로 있는 이유도 이것과 밀접한 연관이 있습니다.


그러니 개발자분들! 이런 시간 오래걸리는 작업은 뭐다? 개별 스레드에서 처리 해야 한다. 이것에 대한 자세한 내용은 심화편에서 다뤄보도록 하겠습니다. 운영자 분들은 궂이 알 필요는 없는 부분입니다.


아직도 이해가 안되는 부분이 있으면 댓글로 남겨주시면 설명 해드리겠습니다.




3개의 댓글

logdev
2020.06.30

싱글 스레드는 싱글 스레드만의 장점이 있고 멀티 스레드는 멀티 스레드만의 장점이 있죠. 싱글 스레드는 순차적 실행이라 사용하기 쉽지만, 여러 것들이 반복적으로 일어나는 경우엔 적합하지 않고. 멀티 스레드는 동시 실행이라 사용하기 어려운 대신, 여러 것들이 반복적으로 일어나는 경우에 속도를 단축시킬 수 있죠

logdev
2020.06.30
@logdev

그래서 개발자인 우리는 스레드 세이프 설계를 해야 합니다. 이런 일거리가 하나 늘었군요

뉴스 및 창작물
/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 4

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 4

물귀신

2024-10-06

3