EC2에서 스타듀밸리 구동시키기

Phonedolly·2021년 6월 4일
0
post-thumbnail
post-custom-banner

스타듀밸리를 GPU 없이 구동해보기

자연스레 내 관심은 얼마나 저렴하게 스타듀밸리 서버를 구동할 수 있느냐로 쏠렸다. GCP는 일단 배제. 아직 익숙하지 않다.

AWS와 Azure 모두 저렴한 가격에 1코어 1GB VM을 제공하고 있다. 요금제를 전략적으로 선택하고 잘 아껴쓴다는 가정하에 1달에 채 1달러가 안되는 가격으로 VM을 이용할 수 있다. 이 1코어 1GB VM으로 스타듀밸리를 구동할 수 있을까? 심지어는 GPU도 없다!

AWS EC2 t2.micro

t2.micro는 AWS 프리 티어로 사용할 수 있는 VM이다. 한달동안 750시간 무료이기 때문에 사실상 VM 1개는 공짜라고 보면 된다.

1달은 24 * 31 = 744(시간)이다.

고주파수 인텔 Xeon 프로세서 1코어에 1GB 램. 네트워크 성능은 Low to Moderate.

여기다가 스타듀밸리를 깔아보기로 했다.

EC2에 VNC 연결

GPU도 없는데 어떻게 VNC를 연단 말인가? 문득 걱정이 되었었다. 그래픽 카드 없이 GUI를 뽑아낸다는게... 이해가 되질 않았다.

Ubuntu 20.04

우선 익숙한 우분투를 사용했다. t2.micro에 Ubuntu 20.04 이미지를 선택.
이런 가이드, 저런 가이드, 다 검색해보며 적용해봤는데 딱히 소득이 없었다.🙄

Ubuntu 18.04

18.04는 꽤 오래된(많이 쓰인) 버전임에도 딱히 잘 되진 않았다. 내가 우분투 서버용 가이드를 본건지, 우분투 데스크톱용 가이드를 본건지, 잘 분간이 안되었다. 글을 쓰는 지금 다시 살펴보니 내가 운이 없었던듯...😯

Amazon Linux 2

이번엔 AWS에서 주력으로 밀고있는 Amazon Linux 2다. yum을 사용하는걸로 보아 레드햇-페도라 기반인 것 같다.

CentOS를 쓸 때 추가 패키지 저장소로 epel이라는 게 있는줄 몰라서 많이 힘들었던 적이 있다. 여러분은 꼭 알아두자.

여기는 아예 AWS에서 가이드를 제공한다. 여러분이 잠시 헤멜 만한 것을 살펴보자면,

  1. 로컬 컴퓨터에서 로컬 포트 5901/TCP(VNC)의 모든 트래픽을 인스턴스의 VNC 서버로 전달하는 터널을 생성하는 동안 SSH를 사용하여 인스턴스에 연결합니다.

SSH를 사용하여 인스턴스에 연결합니다.

-L 파라미터를 사용하여 포트 전달을 활성화합니다. PEM_FILE을 프라이빗 키 경로로 바꿉니다. INSTANCE_IP를 인스턴스의 퍼블릭 IP 또는 프라이빗 IP로 적절하게 바꿉니다.

ssh -L 5901:localhost:5901 -i PEM_FILE ec2-user@INSTANCE_IP

연결을 엽니다.

가이드에서 설치하는 tigervnc-server는 기본적으로 5901포트를 사용한다. 그래서 5901포트를 열어주는 것이다. (사실 대부분의 VNC 서버가 5900번대 포트를 사용한다) PEM_FILE은 여러분이 EC2 인스턴스를 생성할 때 지정한 키 파일이다. INSTANCE_IP에는 EC2 인스턴스의 퍼블릭 IP주소 또는 도메인을 입력하면 된다.

ssh -L 5901:localhost:5901 -i PEM_FILE ec2-user@INSTANCE_IP을 입력하면 보안 그룹 설정에 5901포트가 허용으로 추가된다.


가이드대로 하니 VNC 연결이 잘 되었다. 어떻게 GPU도 없는데 GUI 화면을 출력할 수 있을까? 정말 궁금하다. 그나저나 게임은 잘 돌아갈까?

Amazon Linux 2에 Steam 설치하기

이제 Steam을 설치할 차례다. 사실 내가 처음에 Ubuntu를 선택한건 Steamdeb패키지만 제공하기 때문이기도 했다.

음, 도대체 yum을 쓰는 리눅스에선 어떻게 Steam을 설치할 수 있을까?

Flatpak

FlatpakSnap, AppImage같이 파일 하나로 모든 리눅스 배포판에서 앱 설치/실행을 가능하게 하는 패키지 형식이다. 캐노니컬이 밀어주는 Snap에 비해 패키지 종류가 그리 많지는 않지만, Flatpak에는 Snap엔 없는 Steam이 있다.😀

설치 방법을 알아보자.

  1. $ sudo yum install flatpak

    으로 Flatpak을 설치한다. 재부팅을 해줘도 좋다.

  2. $ wget https://dl.flathub.org/repo/appstream/com.valvesoftware.Steam.flatpakref

    Steam 설치 이미지를 받는다. (정확히 말해서 설치 이미지라기보단, 설치를 위한 참조 데이터를 담은 파일이다. 그래서 용량이 그리 크지 않다)

  3. $ flatpak install com.valvesoftware.Steam.flatpakref

    Steam을 설치한다. 이후 깔끔하게 재부팅을 해도 좋다.

Amazon Linux 2에 스타듀밸리 설치하고 실행하기🙂

이제 VNC로 원격 접속하여 Steam에 로그인한 뒤, 스타듀밸리를 설치한다.🙂

실행해보자.

t2.micro 인스턴스라면 대부분 실행 자체는 되지만 아주 느릴 것이다. 가장 큰 이유라면 램 부족.

$ sar -r 2
Linux 4.14.232-176.381.amzn2.x86_64        06/04/2021      _x86_64_        (1 CPU)

02:15:19 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
02:15:21 AM     62576    944320     93.79         0    144776   3570940    354.65    736540    122816         4
02:15:23 AM     63012    943884     93.74         0    143936   3570940    354.65    739408    119080         4
02:15:25 AM     62908    943988     93.75         0    144488   3570940    354.65    739792    119264         4
02:15:27 AM     62784    944112     93.76         0    144488   3570940    354.65    739816    119240         0
02:15:29 AM     72376    934520     92.81         0    134712   3570940    354.65    735436    113824         0
^C
02:15:30 AM     72484    934412     92.80         0    134712   3570940    354.65    735436    113824         0
Average:        66023    940873     93.44         0    141185   3570940    354.65    737738    118008         2

램 사용량을 확인해보면 거의 100% 가까이 치솟는다. 그래도 GPU 없이 구동된다는 것만으로도 감지덕지다.

$ sar -r 2
Linux 4.14.232-176.381.amzn2.x86_64 (ip-172-31-11-199.ap-northeast-2.compute.internal)        06/04/2021      _x86_64_        (1 CPU)

03:30:40 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
03:30:42 AM    111588    895308     88.92         0    328888   2731508    271.28    578832    196388         4
03:30:44 AM    111588    895308     88.92         0    328888   2731508    271.28    578832    196388         4
03:30:46 AM    111588    895308     88.92         0    328888   2731508    271.28    578832    196388         4
03:30:48 AM    111588    895308     88.92         0    328888   2731508    271.28    578832    196388         4
^C
03:30:49 AM    111588    895308     88.92         0    328888   2731508    271.28    578832    196388         4
Average:       111588    895308     88.92         0    328888   2731508    271.28    578832    196388         4

사실 아이들 상태에서도 램 사용량이 심상치 않았다. %commit 값도 예사롭지 않다. 뭔가 실행이라도 하면 300%를 넘길 것이다.

서버 스펙을 조금만 올려보자.

t3a.small

T3a 인스턴스는 버스트 가능한 차세대 범용 인스턴스 유형으로, 기본 수준의 CPU 성능과 함께, 필요할 때는 언제든지 CPU 사용량을 버스트할 수 있는 기능을 제공합니다. T3a 인스턴스는 컴퓨팅, 메모리 및 네트워크 리소스를 균형 있게 제공하며 사용 중에 일시적인 스파이크를 경험하는 중간 정도의 CPU 사용량을 가진 애플리케이션에 적합하게 설계되었습니다. T3a 인스턴스는 동급의 인스턴스 유형에 비해 최대 10%의 비용 절감 효과가 있습니다.

T3a 인스턴스는 워크로드가 기본 임계값 이하로 작동하는 동안 CPU 크레딧을 축적합니다. 필요한 경우 획득한 각 CPU 크레딧은 T3a 인스턴스가 1분 동안 CPU 코어의 전체 성능을 사용해 순간 확장할 수 있는 기회를 제공합니다. T3a 인스턴스는 무제한 모드에서 필요할 때는 언제든지 확장할 수 있습니다.

기능:

  • 2.5GHz의 올코어 터보 클록 속도를 지원하는 AMD EPYC 7000 시리즈 프로세서
  • CPU 크레딧에 의해 성능 순간 확장이 가능한 CPU 및 일관적인 기본 수준의 성능 제공
  • 기본적으로 피크 기간 중에 성능을 보장하는 무제한 모드와 예측 가능한 월별 비용을 지원하는 표준 모드
  • AWS Nitro System 기반의 전용 하드웨어 및 경량 하이퍼바이저 조합

t3a.smallAMD EPYC 7000 시리즈 프로세서 2단위(1C 2T, 1코어 2스레드), 2GB RAM, (up to) 5Gbps 네트워크를 갖춘 인스턴스다. 여기서부터는 프리티어가 적용되지 않는다. 그러니깐 t2.micro와 달리 유료다! 그래도 small 인스턴스라 사양이 낮아 가격이 저렴한 편이다. 가장 평범한 온디맨드 요금제 기준으로 0.026 USD/시간 (약 29원)이니 하루 가동시간을 조정해보면 (새벽, 아침 시간대엔 아예 끈다던지...) 꽤 괜찮을 것이다.

똑같이 Amazon Linux 2로

t2.micro에서 코어 하나가 늘고 램이 2GB가 된 t3a.small의 성능은 어떨까. VNC 연결과 스타듀밸리 구동까지 확인이 된 Amazon Linux 2를 다시 설치해봤다.

용량이 부족하다. EBS 스토리지를 8GB로 할당했는데. 나중에 안 쓰는 패키지를 지워야겠다.

$ sar -r 2
Linux 4.14.232-176.381.amzn2.x86_64         06/04/2021      _x86_64_        (2 CPU)

02:31:34 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
02:31:36 AM   1429000    579108     28.84      2088    326088   1272040     63.35    280032    210656        40
02:31:38 AM   1429000    579108     28.84      2088    326088   1272040     63.35    279948    210656        40
02:31:40 AM   1429000    579108     28.84      2088    326088   1272040     63.35    280040    210656        40
02:31:42 AM   1429000    579108     28.84      2088    326088   1272040     63.35    280092    210656        36
^C

02:31:43 AM   1429000    579108     28.84      2088    326088   1272040     63.35    280092    210656        36
Average:      1429000    579108     28.84      2088    326088   1272040     63.35    280041    210656        38

아이들 생태에서 램 사용량은 무척 안정적이다. 참고로 스타듀밸리 요구 사양이 램 2GB이다. 이 정도면 괜찮지 않을까?

실행해보자.

딜레이가 좀 있지만 그럭저럭 할 만하다. 이 정도라면 멀티플레이 서버로 돌려도 딱히 문제가 없을 것 같다.

$ sar -r 2
Linux 4.14.232-176.381.amzn2.x86_64         06/04/2021      _x86_64_        (2 CPU)

02:36:06 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
02:36:08 AM     73264   1934844     96.35      1060   1034096   4056084    201.99   1183260    614752      2104
02:36:10 AM     99428   1908680     95.05      1060   1034096   4044552    201.41   1157172    614756      2104
02:36:12 AM     99756   1908352     95.03      1060   1034104   4044552    201.41   1156448    614760       488
02:36:14 AM    100032   1908076     95.02      1060   1034180   4044552    201.41   1156444    614784       488
02:36:16 AM     97676   1910432     95.14      1060   1034420   4044552    201.41   1158716    614836       396
02:36:18 AM     97240   1910868     95.16      1060   1034424   4044552    201.41   1158684    614844       364

메모리 사용량은 여전히 90%대를 찍고 있다. 흥미로운 점은 t2.micro에서 %commit이 354%였던 것이 201%로 감소했다는 것이다. 메모리 할당에 약간의 여유가 더 생겼다.

%commit이 무엇인가?

여기를 참고하자.

What Does %commit Mean?
%commit is the pct of RAM the kernel has committed to processes. Processes can request memory by using malloc().

In the default kernel configuration (vm.overcommit_memory=0, verified with sysctl vm.overcommit_memory), the kernel can commit more memory to processes than the system actually has.

This is because it won’t actually allocate the memory to the process until the process writes to that region of memory.

So, it’s not uncommon to see %commit in sar over 100%.

In the case below, there were values of 300-400 %commit. This means that if all processes requesting memory all touch the memory the kernel says they can, you’d run out of memory. But it doesn’t say much about how much actual memory is being used.

Why?

t3a.smallt2.micro보다 훨씬 나은 성능을 보여줬다. 이유는 아래와 같다.

  • t3a.small의 램 용량은 t2.micro의 2배다. 그래서 스타듀밸리를 실행했을 때 디스크 스왑 파티션에 접근하는 일이 줄어들어 성능이 개선되었다.
  • 추측❓이긴 한데 t2.micro는 프리 티어 제공용이기 때문에 서버 부하가 더 심할 수도 있다. 기본적으로 단독 호스팅이 아니라 CPU 자원을 공유하므로 CPU 본연의 성능을 각 인스턴스가 제대로 뽑아내지 못할 가능성이 높다. 반면 t3a 인스턴스는 진짜로 유료 결제가 이뤄지기 때문에 서버가 좀 널널하지 않을까... 어디까지나 추측이다.

VNCGPU가 없는 컴퓨터에서도 가동되는가?

  • 아직까지도 잘 모르겠다. 가상 모니터나 그래픽카드를 만들어서 여기다가 뿌려주는 척이라도 하는 건지. 단순 화면 출력으로 끝나는 게 아니라 셰이더 모델 3.0+를 요구하는 스타듀밸리가 문제없이 실행되기까지 한다. 가상 드라이버를 진짜로 만들어둔걸까.

next

스타듀밸리가 EC2 인스턴스 위에서 잘 돌아가는 것을 확인했다. 이제 EC2 인스턴스 위의 유령 유저와 클라이언트 유저가 어떻게 소통할지를 고민해볼 차례다.

상태 관리용 웹페이지도 만들어야 하고, 이건 가볍게 Node.js로 웹서버까지 한 번에 처리해버리는 게 알맞겠다. 용량 다이어트도 좀 해야한다. 난 8GB, 아니 6GB 안에서 모든 걸 처리하고 싶다. 서버비 아껴야지.

post-custom-banner

0개의 댓글