서버에서 동일한 바이너리 돌아갈 수 있는 바이너리 컴파일 용도의 서버 구매

asurada92의 이미지

안녕하세요 초보 개발자 입니다.

현재 외부 인터넷과 단절되어 있는 서버를 사용중에 있습니다.

해당 서버에서 작업을 하자니, 외부 인터넷이 막혀 있어 여러 외부 라이브러리의 설치가 너무 어려운 상황입니다.

이러한 상황에서 바이너리의 퍼포먼스는 신경을 쓰지 않고, 해당 서버에서 돌아 갈 수 있는 바이너리를 컴파일 하는 용도로 개인적인 서버를 하나 구매할까 합니다... (비용은 최소한으로...)

다만 해당 서버가 개인용 서버가 아니다 보니, 아무래도 가격이 만만치 않읏듯 한데요, 단순히 돌아 갈 수 있는 컴파일 용도로만 사용한다면 서버 사양에서 어떤 부분들을 조금 신경써야 할까요? (cpu 아키텍쳐 라든지... 오히려 고스펙이면 안맞을 수 있다던가...)

cpu : Intel(R) Xeon(R) CPU E5-2690 0 @ 2.90GHz (32개의 프로세서 잡힙니다.)

OS : Linux version 3.0.13-0.27-default (geeko@buildhost) (gcc version 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux) )

memory : MemTotal: 268662824 kB

요 사양에서 돌아 갈 수 있는 최소한의 사향의 서버는 어느정도로 맞추면 될까요...?

P.S. 추가로 바이너리를 배포할 때, 라이브러리 호환을 확인해야 된다는 kldp의 글을 확했는데요, 파이썬같이 binary들을 맞물려서 사용하는게 아니라 c/c++만 배포할 것이라면 이미 컴파일된 바이너리자체가 나오는 것인데... 라이브러리 호환을 확인할 필요는 없지 않나요!? (초보의 질문입니다...)

ymir의 이미지

프로그램 빌드하고 실행하는 데에 있어, 서버 사양은 크게 상관 없어 보입니다.

다만, 원래 서버와 같은 OS 를 설치해서 native 빌드 해야 한다면..
최신 서버에서는 옛날 OS 가 설치되지 않을 가능성도 있으니..
OS 에 대한 지원 여부를 먼저 확인해 볼 필요는 있을 겁니다.

만약, cross 로 빌드한다면.. H/W 사양이나 스펙은 상관 없습니다.

바이너리 배포할 때, 일반적인 라이브러리 버전 충돌로 인한 문제는..
운영 환경의 라이브러리 버전과, 빌드할 때 썼던 라이브러리 버전이 크게 다를 때 발생할 수 있습니다.

그래도 이거는 별도로 빌드 할 때 썼던 라이브러리를 묶어서 같이 배포하고..
참조 경로를 따로 지정해 줘서 회피 가능한데.. (-rpath 옵션 또는 LD_LIBRARY_PATH 등)
libc 는 예외입니다.

서로 다른 libc 를 쓴다면 해당 라이브러리가 없어서 실행되지 않을 테고..
운영 환경이 glibc 예전 버전인데, 최신 glibc 환경에서 빌드하거나 한다면..
버전 간의 호환성 문제로 실행되지 않을 가능성이 있습니다.

native 빌드한다면, 같은 OS 를 설치하면 문제 해결 될테고..
cross 빌드 하더라도, 툴체인 만들 때 libc 버전만 맞춰서 선택하면 되니..
어쨌든 그 부분만 주의하면 큰 문제는 없을 겁니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

asurada92의 이미지

서로 다른 libc 를 쓴다면 해당 라이브러리가 없어서 실행되지 않을 테고..
운영 환경이 glibc 예전 버전인데, 최신 glibc 환경에서 빌드하거나 한다면..
버전 간의 호환성 문제로 실행되지 않을 가능성이 있습니다.

요 부근에서 질문인데요, 파이썬 같은 인터프리터 언어가 아니라 하나의 바이너리 파일로 완전히 컴파일 되어서 나오는 경우에는 라이브러리 호환 등을 생각 안 해주어도 되지 않나요?, 컴퓨터 내부에 있는 라이브러리를 맞물려서 사용하는 것이 아닌데...? (초보의 질문입니다...)

ymir의 이미지

보통 라이브러리들은 shared 로 빌드하더라도 별도로 우선 참조 가능하고..
필요하면 static 으로 link 해서 빌드할 수도 있으니까 별 문제는 없는데..

libc 같은 애들은 static linking 을 지원하지 않는 걸로 알고 있습니다.
말 그대로 시스템에 설치되어 있는 libc 버전을 고려하지 않을 수 없다는 뜻입니다.

다른 버전의 libc 를 설치해서 선택적으로 link 해서 실행할 수는 있을 것 같은데..
어쨌든 같은/비슷한 버전의 OS 라면, 그렇게 문제될 일은 없을 겁니다.
일단 돌려보고, 혹시라도 문제가 생기면 그 다음에 고민해도 될겁니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

김정균의 이미지

glibc 는 static library 가 있습니다. 배포본에서 제공을 해 주느냐 안해 주느냐의 문제일지는 모르겠지만요.
CentOS 6 은 glibc-devel pakcage 에 포함되어 있고, CentOS 7 의 경우 glibc-static 이라는 패키지에 들어 있습니다. 다른 OS의 libc 는 모르겠군요 :)

ymir의 이미지

아.. 그렇군요..;;
뭔가 고정관념이 틀어박혀 있었는지, 하다 못해 검색해 볼 생각도 못했네요..

$ cat > hello.c
#include <stdio.h>
 
int main(void)
{
    printf("hello world.\n");
 
    return 0;
}
^C
$ gcc -g -W -Wall -o foo -static foo.c
$ file foo
foo: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=f98f578727e3ff09b81b9cfadfcbd626db524432, with debug_info, not stripped
$ ldd foo
        not a dynamic executable
$ strace -e openat ./foo
hello world.
+++ exited with 0 +++
 
$ gcc -g -W -Wall foo.c
$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=5c19788e4621d5497ae411e063dbe5f31c7b8042, not stripped
$ ldd a.out
        linux-vdso.so.1 (0x00007ffe8e9ee000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9e4b4000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8b9eaa7000)
 
$ strace -e openat ./a.out
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
hello world.
+++ exited with 0 +++
 
$ ls -al foo a.out
-rwxrwxr-x 1 ymir ymir   8296  218 15:56 a.out
-rwxrwxr-x 1 ymir ymir 847128  218 15:55 foo

* -static 옵션을 주면 /usr/lib/x86_64-linux-gnu/libc.a 를 static 으로 link 합니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지

glibc 에만 들어있는 함수를 사용하지 않았다면 abi 버전이 같은 다른 libc 를 사용해도 정상 작동될 겁니다.

Stephen Kyoungwon Kim@Google의 이미지

구입하실 서버에, 지금 갖고 계신 서버와 환경이 같은 docker container를 올려놓고 그 위에다 프로그램을 빌드하시면 될 것 같아요. 뭘 컴파일하실지 모르겠지만 많은 경우에 machine dependent한 최적화가 생각보다 큰 역할을 하지는 못합니다. 혹은 최적화를 정말 잘 해야지 그냥 -march=native 정도로는 별로 차이가 나지 않습니다.

큰 프로그램을 빌드하실 경우 cpu 코어 수와 메모리가 좀 많으면 좋습니다. 코드 사이즈가 파이어폭스 정도 된다면 모르겠는데 그냥 리눅스 커널 정도 컴파일 하시는 거라면, 그것도 개인 서버라면 본체만 한 50 ~ 60만원 선에서 내장 그래픽 카드 넣어서 찾아보셔도 될 거 같습니다.

asurada92의 이미지

도커에 대해서 대충 감은 알겠어요, 그런데 실제로 사용을 할때요, 제가 지금 사용하고 있는서버의 정보들을 어떻게 파싱해주나요?, 지금 있는서버에도 도커를 설치해서 뽑아내야 하나요...?, 외부 인터넷이 안되는 서버라 이 과정이 복잡하면 난해해서요... ㅠㅠ

Stephen Kyoungwon Kim@Google의 이미지

해주시면 좋겠습니다.

저도 답을 대충 단 것 같은데, 제 의도는 보통 ISA가 같다고 가정할 때, 한 머신에서 컴파일 한 코드를 다른 머신에서 수행할 수 없는 것은 대부분 소프트웨어 스택 문제이므로 가급적 코드를 수행할 서버와 소프트웨어 스택을 비슷하게 만들어서 빌드하는 것이 좋지 않냐는 의도였습니다.

그래서 docker 얘기를 한 것이고요.

서버와 모든 것을 동일하게 할 필요는 없을 것 같고, 서버와 동일한 base image 위에다 서버에서 실제로 서비스되는 것--예를 들어 apache라고 해보죠--과 그게 의존하는 소프트웨어들의 버전만 강제로 맞춰주면 되지 않을까 싶어요. 이 경우에 emacs나 vim 버전까지 맞출 필요는 없겠죠. 그러니까 서버에 있는 모든 소프트웨어와 그 버전을 가져오는 방법은 배포판마다 다를 뿐 거의 있을 것 같은데, 그걸 할 필요까지는 없어 보입니다.

docker는 커널은 호스트 커널을 그대로 쓰고, 그 위에 올라가는 소프트웨어는 흔히 base image라고 부르는 곳에서 가져옵니다. 이를테면, 서버가 Ubuntu 18.04 라면 베이스 이미지로 Ubuntu 18.04를 쓰는 게 좋겠지요. 이 상태에서 update를 하면 모든 소프트웨어가 그 배포판 버전에서 지원되는 최신 소프트웨어로 업데이트 될 텐데, 이렇게 하면 서버와 너무 달라질 수 있을 것 같습니다. 극단적인 예로 서버가 sshd만 서비스를 하고 openssl 1.0.9에 의존한다면, openssl과 openssh만 서버와 같은 버전으로 강제하고--레드햇의 경우 yum versionlock이라는 커맨드가 있고 젠투의 경우 "mask"라는 매카니즘이 있으며 배포판마다 명령어는 조금씩 다를 테지만 방법은 있을 겁니다--나머지는 최신으로 업데이트 하면 되지 않느냐는 얘기였습니다.

하여튼 하시려고 하는 게 정확히 뭔지 알아야 좀더 적절한 조언을 드릴 수 있을 것 같습니다.

asurada92의 이미지

도커에 대해서 대충 감은 알겠어요, 그런데 실제로 사용을 할때요, 제가 지금 사용하고 있는서버의 정보들을 어떻게 파싱해주나요?, 지금 있는서버에도 도커를 설치해서 뽑아내야 하나요...?, 외부 인터넷이 안되는 서버라 이 과정이 복잡하면 난해해서요... ㅠㅠ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.