[WASM] 범용 컨테이너로서의 WASM

[원본 링크]

WASM은 본래 브라우저 환경에서, Javascript 특유의 끔찍한 성능 문제를 개선하려는 목적에서 나온 실행 포맷이었다.
아직 발전중이고, 브라우저 지원 측면에서 완성되거나 안정화되었다고 말하긴 어렵지만, 현재도 성능이 필요한 영역에서는 드물지 않게 쓰이는 현역이다.

그런데 이 WASM을 브라우저 밖으로 나와서, Docker 컨테이너의 대체재로서 사용하고자 하는 움직임도 종종 보인다. 그 방향성과 현황에 대해서 간략히 정리해본다.




WASM 컨테이너 진영의 주장

WASM 만능론자들의 주장에 따르면, 기존 컨테이너 스택들은 너무 무겁고, 느리고, OS 호환성도 좋지 못하다.

그래서 WASM이라는 형태 자체를 모든 플랫폼 통합을 위한 경량 런타임으로 만들어서, 모든 코드를 WASM로 빌드한 다음에 WASM 런타임을 통해 실행하면 모든 문제가 해결된다는 것이다.

그 주장에 따르면, 훨씬 빠르게 실행되고, 가볍고, 사용성도 좋다.

현재 WASM을 브라우저 바깥에서 실행하는 방법은, 아직 그다지 잘 정립되지는 않았다.
일단 WASM을 실행해주는 런타임 구현체들이 이것저것 나와있고, Docker 같은 도구를 통해서 wasm을 실행할 수 있긴 하다. 저걸 쓰면 Docker가 아니라 WASM 자체 런타임으로 실행된다.

https://docs.docker.com/desktop/features/wasm/
런타임별로 성능이나 완성도가 좀 다른거같으니, 진지하게 쓸 생각이 있다면 조사를 잘 좀 해봐야할거같다.




vs Docker Container

WASM의 우월성을 내세울 때는 Docker 같은 컨테이너 기반 가상화와 비교하곤 한다.

**Docker의 단점 **
Docker 같은 컨테이너 스택들은 핵심 구현을 대부분 Linux 커널에 의존하기 때문에, Linux 환경에서만 사용이 가능하다.
그래서 Windows나 MacOS에서 컨테이너를 사용할 경우에는 Linux VM을 띄우고 쓰기 때문에, 성능 저하가 크게 드러나긴 한다. 하지만 Linux가 Host라면 성능저하는 별로 없다.

**WASM의 장점 **
그래서 WASM을 쓰면 이런걸 해결할 수 있다고 한다. WASM 자체는 플랫폼 중립적이기 때문에 모든 플랫폼에서네이티브급 성능을 낼 수 있다는 것이다. 플랫폼 독립성에 있어서는 Docker보다 낫다고 말할 수 있다.
그리고 보통 수십mb, 수백mb에 gb단위까지 가서 무거워지면 실행이 느려지는 Docker에 비해서 WASM은 단순 스크립트라서 실행이 빠르다고 주장한다.

Docker의 장점과 WASM의 단점
하지만... 잘 생각해보면 WASM이 Docker보다 부족한 부분도 많다. 특히 성능은 과장이 많다.
일례로, Docker는 엄밀한 의미에서의 가상화가 아니기 때문에, Linux를 쓴다면 진짜 네이티브 연산이 된다.
하지만 WASM은 자기들은 네이티브 성능이라고 주장하지만, 결국은 일종의 인터프리터에 WASM 코드를 실행하는 것이라서 성능 저하가 없을 수 없다.
그리고 WASM은 현 시점에서 멀티스레드를 지원하지 않는다. 최적화에 뚜렷한 한계가 있다는 말이다.

그래서 떠도는 벤치마크들을 보면 네이티브를 이기진 못하고, nodejs 같은 허접들이랑 벤치 돌려서 이기는걸 자랑하는게 더 많더라.




vs JVM

플랫폼 독립적인 런타임에, 스크립트를 넣으면 네이티브에 준하는 뛰어난 최적화를 해준다...
이거 완전 자바 아닌가...? 심지어 GraalVM 프로젝트는 모든 것을 JVM 기반으로 통합하는 원대한 목표를 향해 달려가고 있다.

동시성 처리 능력, 최적화, 메모리 관리 능력, 풍부한 생태계까지 고려한다면, 사실 JVM에 바이트코드를 올리는게 WASM보다 강력할 수도 있다.

물론 WASM이 가지는 장점도 존재한다. 좀 더 low한 메모리 접근이 가능하고, 자체적으로 보안을 위한 샌드박스 구조가 존재한다. 또 WASM은 기본적으로 좀 무거운 JVM에 비해 더 가볍다.
그리고 애초부터 다양한 언어를 통해 빌드되는 것을 염두해서 JVM보다는 더 풍부한 확장성을 가질 것이라고 "기대를 할 수 있다."




그럼에도

꽤 재미있는 시도고, 주목할만한 기술인 것은 맞는 것 같다.
내가 볼 때 Docker를 대체하는 것은 과장이 심하고, 1:1 교체가 안되는 부분이 많다.

다만 정말 경량 서버리스 기반의 아키텍쳐를 잡는다고 하면 선택지 중 하나가 될 수도 있을 것 같다.



참조
https://wasmedge.org/docs/start/build-and-run/docker_wasm/
https://docs.docker.com/desktop/features/wasm/
https://stackoverflow.com/questions/58131892/why-the-jvm-cannot-be-used-in-place-of-webassembly
https://wasmlabs.dev/articles/docker-without-containers/