반응형

서버든 노트북, 데스크탑이든 ... 가장 중요한 부분 CPU라고 볼수 있는데 서버에 많이 사용하는 Intel Xeon CPU에 대해서 알아보는 시간을 갖고자 합니다.

 

일반적으로 Intel CPU에는 3가지의 라인업이 있는데 일반 PC용으로 개발되는 i프로세서, 모바일 기기용으로 개발되는 Atom프로세서, 그리고 서버용으로 개발되어 가상화, 병렬처리, 신호 암호화, ECC 메모리 지원, 다중 CPU 소켓을 지원하는 E프로세서(XEON)라 나누어 집니다.

 

가상화: 제온 프로세서는 클라우드 컴퓨팅의 필수조건인 가상머신(VM)을 위한 다양한 기능을 제공한다. 가상머신이 더욱 빠르고 효율적으로 작동할 수 있도록 관련 성능을 지속적으로 개선하고 있다. 가상화 관련 기능은 서버 뿐만 아니라 워크스테이션에도 유용하다. 제온 프로세서의 가상화를 활용하면 하나의 워크스테이션에서 여러 개의 운영체제를 더욱 빠르게 실행할 수 있다. 일반 PC용 프로세서에서도 가상머신을 활용해 여러 개의 운영체제를 동시에 실행할 수 있으나, 가상머신의 숫자를 늘리면 늘릴 수록 기하급수적으로 느려진다. 서버 관리자나 개발자들에게 유용한 기능이다.

 

병렬처리: 제온 프로세서는 수많은 CPU를 연결해 성능(처리능력)을 끌어올리는 병렬 컴퓨팅을 지원한다. HPC(슈퍼컴퓨터)나 클라우드 컴퓨팅 시스템 구축을 위한 기능이다. 제온 프로세서는 병렬 컴퓨팅을 지원하는 애플리케이션에서 최적의 성능을 낸다. 예를 들어, 구글의 인공지능 알파고를 지탱하는 구글의 클라우드 컴퓨팅 플랫폼(GCP)은 1202개의 제온 프로세서를 병렬로 연결해 알파고에게 막대한 처리능력을 부여했다.

 

멀티코어: 제온 프로세서는 수십 개의 CPU 코어를 탑재하고 있다. 이번에 소개된 제온 E5 V4 프로세서만 해도 최대 22개의 CPU 코어를 제공한다. 보통 2개(듀얼코어) 많아봐야 4(쿼드코어)~8개(옥타코어) 정도의 CPU 코어만 탑재하는 일반 PC용 프로세서와 대조적인 모습이다. 이는 앞에서 설명한 병렬처리를 극대화하기 위함이다. 코어 하나의 처리속도(클록)를 향상시키는 것은 한계가 있기 때문에 현재 HPC와 클라우드 컴퓨팅 환경은 최대한 많은 코어를 연결해 병렬처리속도를 향상시키는 것에 초점을 맞추고 있다. 대부분의 제온 프로세서는 발열을 줄이기 위해(=데이터센터의 유지비용 때문이다) 개별 코어의 클록을 일반 PC용 프로세서보다 낮게 설계한다.

 

신호 암호화: 제온 프로세서는 클라우드 컴퓨팅 보안을 위한 처리 신호 암호화를 지원한다. SW적인 보안 능력 뿐만 아니라 HW적인 보안 능력도 갖추고 있다.

 

ECC 메모리: 제온 프로세서는 서버에서 발생하는 처리 오류를 방지하기 위해 서버용 ECC(오류검출) 메모리를 지원한다. 제온 프로세서를 탑재한 워크스테이션, 서버 대부분이 ECC 메모리를 채택하고 있다.

 

다중 CPU 소켓: 제온 프로세서는 병렬처리의 효율을 극대화하고, 데이터센터의 공간을 절약하기 위해 하나의 메인보드에 여러 개의 CPU를 연결할 수 있다. 하나의 보드에 연결할 수 있는 제온 프로세서의 숫자는 모델별로 다르나, 일반적으로 상위 모델일 수록 하나의 보드에 더 많은 CPU를 심을 수 있다.

 

Xeon CPU는 기본적으로 1~2세대 느린 아키텍처를 적용하게 되는데 그 이유는 신뢰성의 문제라고 볼 수 있습니다. 서버는 기본적으로 기업에서 사용되는 만큼 고가의 장비이며 문제가 생기면 금전적인 문제가 생기기 때문에 Intel은 일반 PC에서 검증이 끝난 플랫폼을 서버에 채용하게 됩니다

 

Xeon CPU는 E3, E5, E7으로 3가지 계열이 있으며 성능은 E7>E5>E3입니다.모델명을, V(숫자)는 '버전'을 의미한다. 즉 '제온 E5-2600 V4'는 제온 E5 프로세서의 4번째 모델이라는 뜻이다.

 

E3: E3는 제온 프로세서 가운데 가장 하위모델이다. 싱글소켓 서버와 개인용 워크스테이션을 위한 제품이다. 사실 E3의 가장 큰 특징은 순수한 제온 프로세서가 아니란 것이다. 일반 PC용 프로세서인 코어 i 시리즈에서 내장 그래픽 프로세서를 제거하고, 대신 서버와 워크스테이션을 위한 기능 일부를 추가했다. 때문에 과거에는 코어 i 시리즈용 메인보드에 제온 E3를 꽂아서 사용할 수도 있었다. (현재는 불가능하다) 이러한 특징 때문에 사용자들은 제온 E3를 가짜 제온을 의미하는 비속어 '짭제온'이라고 부르기도 한다.

 

E5: E5는 제온 프로세서의 중급 모델로, 가장 많이 판매되는 제품이다. 중대형 서버와 클라우드 데이터센터를 위한 프로세서다. 제온 프로세서 전체 판매량의 70%를 제온 E5가 차지하고 있다. 실제로 대부분의 서버는 제온 E5를 활용해 제작되며, 클라우드 데이터센터에 가장 많이 공급되는 모델이기도 하다. 싱글 또는 듀얼소켓을 지원한다. 일반 사용자는 E3와 E5 모델만 구매할 수 있다.

 

E7: E7은 제온 프로세서의 최고급 모델이다. 시중에 존재하는 단일 프로세서 가운데 최고의 성능을 자랑한다. 미션크리티컬, 슈퍼컴퓨터, 대용량 컴퓨팅을 위한 스케일업 등에 활용된다. 하나의 보드에 최대 8개의 프로세서를 연결해 병렬 컴퓨팅을 구성할 수 있다. 일반 사용자는 E7을 구매할 수 없고, 기업이 대량으로 구매를 원할 때에만 인텔이 특별 공급하고 있다.

 

 

 

반응형

'인프라 구축 기술' 카테고리의 다른 글

VIP (Virtual IP)란 ??  (0) 2017.12.06
RAID 와 HBA 카드 (2)  (0) 2017.11.13
RAID 와 HBA 카드 (1)  (0) 2017.11.07
메모리의 종류 (UDIMM, RDIMM, RLDIMM, NVDIMM)  (0) 2017.10.23
서버 시스템 이해하기  (0) 2017.10.09
반응형

저는 이제까지 리눅스 서버 운영체제에서의 작업을 많이 했습니다. 그 영향일지는 몰라도 윈도우 서버에 대해서는 그다지 ... 호의적이지 않았고 클라이언트 OS에 비해 현업에서 사용하기에 효율성이 그다지 높지는 않았습니다.

 

뭐 윈도우서버가 리눅스서버보다 나쁘다라는 개념은 아니지만 자동화나 운영 측면에서 부족한 부분이 많은 것도 사실입니다. 그런 부분을 고려한건지는 모르겠지만 마이크로 소프트는 리눅스의 쉘 스크립트에 대응하기 위해 파워쉘을 출시했고 아직은 많이 부족하지만 막강한 Tool임에는 분명합니다.

 

쉘 스크립트는 기존의 리눅스 명령를 비롯한 리눅스의 다양한 오픈소스를 이용할 수 있다는 장접이 있듯이 파워쉘은 다양한 .NET으로 이루어진 솔루션들을 간단하게 통합할 수 있습니다.

 

현재는 window8 과 window server 2012R2에 기본으로 설치되어 있지만 마이크로소프트 홈페이지에서 다운받아 설치할 수가 있습니다 .

반응형

'파워쉘 스크립트' 카테고리의 다른 글

powershell 스크립트 실행오류  (0) 2018.01.04
반응형

 

쉘스크립트에서 if문을 사용할 때는 반드시 조건문을 사용하게 됩니다.

 

다양한 조건문이 있으며 크게 산술 비교 연산자, 파일 검사 연산자, 문자열 비교 연산자 이렇게 3가지로 나누어 있으며 아래 항목을 적어놨습니다.

 

 

산술 비교 연산자

val1 –eq val2 : equal, 변수 val1과 변수 val2 같은 경우 true
val1 –ne val2 : negative, 변수 val1과 변수 val2 다른 경우 true
val1 –gt val2 : greater then, 변수 val1이 변수 val2 보다 큰 경우 true
val1 –lt val2 : less then, 변수 val1이 변수 val2 보다 작은 경우 true
val1 –ge val2 : greater or equal, 변수 val1이 변수 val2 보다 크거나 같은 경우 true
val1 –le val2 : less or equal, 변수 val1이 변수 val2 보다 작거나 가은 경우 true
 

파일 검사 연산자

-a : 파일이 존재한 경우 true
-b : 파일이 존재하고 블록장치 파일인 경우 true
-c : 파일이 존재하고 캐릭터 장치 파일인 경우 true
-d : 파일이 존재하고 디렉토리인 경우 true
-e : 파일이 존재하고 파일이 있는 경우 true
-f : 파일이 존재하고 정규 파일인 경우 true
-g : 파일이 존재하고 SetGID가 설정된 경우 true
-h : 파일이 존재하고 한 개 이상의 심볼릭 링크가 설정된 경우 true
-k : 파일이 존재하고 Sticky bit가 설정된 경우 true
-p : 파일이 존재하고 FIFO인 경우 true
-r : 파일이 존재하고 읽기 가능한 경우 true
-s : 파일이 존재하고 0보다 큰 경우 true
-u : 파일이 존재하고 SetUID가 설정된 경우 true
-w : 파일이 존재하고 쓰기가 가능한 경우 true
-x : 파일이 존재하고 실행 가능한 경우 true
 

문자열 비교 연산자

-z string         : 문자열의 길이가 0인 경우 true
-n string         : 문자열의 길이가 0이 아닌 경우 true
string1 = string2 : 문자열 string1과 string2가 일치하는 경우
string1 != string2: 문자열 string1과 string2가 일치하지 않는 경우
string            : 문자열이 NULL이 아닌 경우

반응형
반응형

shell 스크립트에서 if 문은 대표적으로 사용하는 조건문입니다.

 

기본적인 형식은 아래와 같습니다

 

 if [ 조건문 ]

 then

   수행문 ...

 fi

 if [ 조건문 ]

 then

   수행문 1 ...

 else

   수행문 2 ...

 fi

 if [ 조건문 1 ]

 then

   수행문 1 ...

 elif [ 조건문 2 ]

 then

   수행문 2 ...

 else

   수행문 3

 fi

 

사용방법은 다른 언어들과 차이들이 없지만 중요한 점은 인터프리터 언어의 특성상 사용방법을 준수해 줘야 합니다.

 

 if^[^조건문^]

 

if문을 사용할 때는 위에와 같이 띄어쓰기를 해주어야 하는 점을 명심해 주시기 바랍니다. 예제를 통해 3가지 형식의 샘플을 보여드리겠습니다.

 

<Sample 1>

 #!/bin/bash

 A=10
 B=0
 echo "A=$A B=$B"
 if [ $A -gt $B ]
 then
   echo "A는 양수입니다"
 fi

 root@ubuntu:/shell# ./if.sh
A=10 B=0
A는 양수입니다

 

<Sample 2>

 #!/bin/bash

 A=5
 B=10
 echo "A=$A B=$B"
 if [ $A -gt $B ]
 then
    echo "A가 큽니다"
 else
    echo "B가 큽니다"
 fi

 root@ubuntu:/shell# ./if_1.sh
A=5 B=10
B가 큽니다

 

<Sample 3>

 #!/bin/bash

 A=5
 B=5
 echo "A=$A B=$B"
 if [ $A -gt $B ]
 then
    echo "A가 큽니다"
 elif [ $A -eq $B ]
 then
   echo "A와 B는 같습니다"
 else
    echo "B가 큽니다"
 fi

 root@ubuntu:/shell# ./if_2.sh
A=5 B=5
A와 B는 같습니다

 

감사합니다.

반응형
반응형

유닉스(리눅스)시스템에서 모든 프로세스는 PID가 1인 init 프로세스의 자손이다. init 부트 과정의 최종단계에서 커널이 실행하는 프로세스다

 

시스템의 모든 프로세스는 정확히 하나의 부모 프로세스를 가지며 모든 프로세스는 하나이상의 자식 프로세스를 가질수 있다. 같은 부모 프로세스를 가지는 자식 프로세스를 형제(sibling)이라고 부른다.

 

task_struct 구조체에는 부모의 task_struct를 가리키는 parent라는 포인터와 task_struct 리스트를 가리키는 children 포인트가 있으며 결과적으로 주어진 현재 프로세스에서 부모 프로세스의 task_struct를 얻을 수 있다.

 

<부모 프로세스 찾기>

struct task_struct *my_parent = current->parent;

 

<자식 프로세스 찾기>

struct task_struct *task;

struct list_head *list;

 

list_for_each(list, current->children)

{

task = list_entry(list, struct task_struct, sibling)

// 이제 task는 현재 프로세스의 자식 프로세스 중 하나를 가르킨다

}

 

 

프로세스 생성

 

대부분의 운영체제는 스폰(Spawn)방식을 사용하여 새로운 주소공간에 새 프로세스를 만들고, 실행 파일을 읽은 다음 그 코드를 실행한다. 유닉스&리눅스는 이 과정을 fork(), exec()라는 두 함수로 나누어 실행한다

 

먼저 fork()는 현재 태스크를 복제해 자식 프로세를 만든다. 이렇게 만들어진 프로세스는 PID(프로세스의 고유값), PPID(부모 프로세스의 PID), 상속되지 않은 지연된 시그널과 같은 일부자원, 통계수치를 제외하고는 부모와 동일하다. 다음으로 exec()는 새로운 실행파일을 주소공간에 불러오고 실행하게 된다.

 

Copy-on-Write (기록사항 발생시 복사, COW)

 

리눅스에서는 copy on write 페이지를 이용해 fork() 함수를 구현했다. COW기능은 데이터 복사를 지연 또는 방지하는 기능이다. 프로세스 주소공간을 복사하는 대신 부모와 자식 프로세스가 같은 공간을 공유한다.

 

그러나 기록 사항이 발생해 데이터 변경이 필요하면 그 순간 사본이 만들어 지고 각 프로세스가 별도의 내용을 가지게 된다. 따라서 리소스 복사는 해당 리소스에 대한 기록이 발생하는 경우에만 발생한다.

 

이 방법은 주소공간에 실제 기록작업이 일어 날때가지 각 페이지의 복사 작업을 지연시키며 프로세스가 절대 기록을 하지 않는 경우 복사가 필요 없어 진다.

 

리눅스의 스레드

 

스레드를 이용해 메모리 주소공간을 공유하는 같은 프로그램 여러개를 동시에 실행 할 수 있다. 스레드를 통해 동시 프로그래밍(Concurrent Programming)이 가능하고, 다중 프로세서 시스템에서는 진정한 병렬처리를 구현 할 수 있다.

 

리눅스는 기본적인 프로세스로 모든 스레드를 구현한다.  별도의 자료구조나 스케줄링 기법없이 특정 자원을 다른 프로세스와 공유하는 특별한 프로세스로 다루게 된다. 각 스레드는 task_struct 구조체를 가지고 있으며 커널 입장에서는 주소공간과 같은 자원을  다른 프로세스와 공유하고 있는 프로세스이다.

 

스레드의 생성

 

정상적인 프로세스(태스크)와 같은 방식으로 만들어지지만 clone() 시스템에서 특정 자원을 공유할 수 있도록 Flag를 지정해 준다.

 

커널 스레드

 

커널의 일부 동작을 백 그라운드에서 실행하는 것이 좋을 때가 있다 . 커널 공간에서만 존재하는 표준 프로세스인 커널 스레드를 이용해 백그라운드 작업을 수행 할 수 있다.

 

정상 프로세스와의 차이점은 커널 스레드에는 주소공간이 없다는 점이다. (mm포인터 값이 NULL) 커널 스레드는 커널 공간에서만 동작하며 사용자 공간에서만 동작하며 사용자 공간으로 컨텍스트 전환이 일어나지 않는다. 하지만 커널 스레도도 스케줄링이 되며 선점이 가능하다.

 

대표적인 예로는 flush 및 ksoftirq 작업을 예로 들 수 있다. 리눅스는 kthreadd 커널 프로세스가 모든 커널 스레드를 만드는 방식으로 커널 스레드를 관리한다.

 

struct task_struct *kthread_create(int (*threadfn)(void *data),
                                             void *data,
                                                 const char namefmt[], ...);

 

kthread_create()는 date 매개변수를 통해 전달된 threadfn 함수를 실행하며 namefmt문자열에 해당하는 이름을 갖게 된다.

 

 

처음 프로세스는 실행할 수 없는 상태로 만들어지기 때문에 wake_up_process()함수를 통해 명시적으로 깨워주지 않으면 실행되지 않는다.

 

커널 스레드는 한번 시작되면 스스로 do_exit() 함수를 호출하거나, 커널의 다른 부분에서 kthread_create()가 반환한 task_struct 구조체의 주소와 함께 kthread_stop() 함수를 호출할 때 까지 계속 실행된다
 

 

 

반응형
반응형

모든 프로그래밍 언어???는 변수를 통해서 데이터를 생성, 저장, 변경등을 하게 됩니다. 그만큼 처음 프로그래밍을 함에 있어서 가장 중요한 부분을 변수라고 볼수 있습니다. 보통 C언어나 JAVA의 경우에는 자료형이라는 이름으로 변수를 관리하게 됩니다. 보통 실수형, 정수형, 문자, 문자열 등으로 구분해서 사용하게 됩니다. 그런데 쉘 스크립트의 경우에는 변수에 자료형이라는 개념이 없습니다.

 

어쩌면 이부분이 다른 언어를 사용한 개발자들에게 생소한 방법이겠지만 생각해보면 간단합니다. C언어나 JAVA같은 경우에는 컴파일러를 통하기 때문에 사전에 컴파일러에게 이 변수의 사용목적을 알려주기 위해 사용이 됩니다. 그렇지만 쉘 스크립트는 아주 오래된 인터프리터 언어로서 Line By Line으로 실행이 되기 때문에 이런 과정이 있을 경우에는 실행 시간이 오래 걸리게 됩니다. 물론 요새 나오는 파이썬이나 다른 인터프리터의 경우는 아니지만요 ^^

 

그렇다면 가장 중요하게 생각해야 될 부분은 쉘 스크립트에서 변수를 사용함에 있어서 어떻게 사용하고 이용할 지 계획과 설계를 잘해야 개발 및 유지보수과정에서 어려움을 최소화 할 수 있습니다.

 

그렇다면 간단한 예제 코드를 보고 마무리 하도록 하겠습니다.

 

 #!/bin/bash

A=1234
string_1=hello
string_2='hello world'


echo "A : integer = $A"
echo "string_1 = $string_1"
echo "string_2 = $string_2"

 

아래코드는 정수형 및 문자열 2개를 샘플로 작성했습니다.

첫번째 줄은 어떤 쉘 스크립트를 사용할 지 지정해줍니다. 저는 가장 범용적인 bash를 이용했습니다. 쉘 스크립트는 역사만큼 다양한 종류에 쉘이 있으며 사용방법도 다양한 만큼 여기서는 가장 기본적인 bash 쉘을 기본으로 설명하도록 하겠습니다

 

변수를 대입함에 있어서 bash쉘에서는 절대 공백이 있어서는 안됩니다. 그렇게할 경우 실행과정에서  문제가 발생되는 만큼 유의해 주시기 바라며 나머지는 다른 프로그래밍 언어와 대동소이 합니다. 특이한 점은 perl에서 영향을 받은 점인데 선언할 때는 그냥 해당 변수를 선언해야 되지만 그 변수를 사용함에 있어서는 해당 변수명에 '$'를 붙여야 하는 점을 기억해주시기 바랍니다.

 

끝으로 스크립트 실행 결과 입니다.

 

 root@ubuntu:/shell# ./var.sh
A : integer = 1234
string_1 = hello
string_2 = hello world

 

 

 

반응형

+ Recent posts