Version #

작성일

작성자

E-mail

설명

1.00

2011.3.3

김호연

hykim@q.ssu.ac.kr

첫 버전 작성함

1.01

2011.6.24

김호연

hykim@q.ssu.ac.kr

발생할 수 있는 오류내용 추가

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

첨부 : 1) 원본문서(hwp,pdf)
2) Besim httpd 환경설정 파일(httpd.conf_Besim)


SPECweb2005 Install & Configure Guide in Linux(fedora 13)

Version #

작성일

작성자

E-mail

설명

1.00

2011.3.3

김호연

hykim@q.ssu.ac.kr

첫 버전 작성함

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

본 문서는 SPECweb2005를 설치하고 구동하는 과정을 설명합니다.

본 문서의 목적은, 어떠한 시행착오 없이 SPECweb2005을 보다 쉽게 사용할 수 있도록 함에 있습니다.

본 문서는 SPECweb2005에서 제공하는 매뉴얼을 기반으로 작성되었습니다.(SPECweb2005\docs\index.html)

본 문서의 내용은 추가/삭제/수정이 가능하며, 수정본을 http://nclab.tistory.com/‘SPECweb2005’ 코너에 올려 주시거나, 상단의 제작자에게 메일을 주시기 바랍니다.

 

알아둘 내용

본 문서의 내용은 기본적인 Linux관련 지식이 있다는 가정아래 진행.

문서에서 사용된 기호의 의미

: 실제적으로 command가 입력되는 부분.

: 설명 및 할당 값

<디렉토리> ] # : command를 입력하는 디렉토리. ‘] #’ 의 경우, 어디서든 상관없음을 의미.

Apache : Linux fedora에서 'httpd'라는 이름으로 기본 제공됨. , Apache=httpd.

 

 

SPECweb2005 설치

Web Server, Besim, Client 공통 요구사항

> java : Web server, Besim, client에 각각 설치.

] # yum groupinstall java

 

console을 통해 설치 진행

> java -jar setup.jar -i console

설치에 어려움은 없을 것이라 판단됨. 안내를 따라 설치할 것.

이후의 내용은 default값을 기준으로 함.

 

 

Web Server

요구사항

> Apache(httpd) : 이 문서에서는, Apache를 이용한 php 사용.

> Version Check : PHP 4.3.n 이상의 버전이 필요함.

다음명령어를 통해 설치 혹은 update

☞ …] # yum install php

 

1) 에서 webserver를 설치 : '/web2005-1.20/' 디렉토리에 설치됨

2) ScriptApache(httpd)'DocumentRoot' 디렉토리로 복사

☞ …] # cp /web2005-1.20/Scripts/php/* /var/www/html/

 

DocumentRoot : httpd의 환경설정 파일인 “/etc/httpd/conf/httpd.conf” 파일내의 변수.

Default = “/var/www/html/”

3) ‘DocumentRoot’ 디렉토리에서, 권한 부여

☞ …/html]# chmod -R a+rw bank/ ecommerce/ support/ Smarty-2.6.7/

4) Wafgen

4-1) Wafgen README를 정독한다.

4-2) '/web2005-1.20/wafgen/unix/'에 해당하는 파일들을 수정

'SIMULTANEOUS_SESSIONS' 'DOCROOT' 값을 반드시 넣어 주어야 함.

SIMULTANEOUS_SESSIONS : 동작시킬 Thread의 최대 개수 할당

*_image_*.rc 의 경우, SIMULTANEOUS_SESSIONSSection B 아래 존재하므로 변경하지 말 것.

DOCROOT : '2)''DocumentRoot' 값 할당

4-3) '/web2005-1.20/wafgen/‘에서 wafgen 실행 : workload 설치

☞ …/wafgen] # java -Xms384m -Xmx384m -jar wafgen.jar <workload>.rc

4-4) ‘<DOCROOT>/<workload>/‘dynamic_padding images 디렉토리 생성 확인

 

5) Web server 동작 test

5-1) Apache(httpd) 재시작

☞ …] # service httpd restart

5-2) 브라우저를 통하여, login.php 접속

: URL = http://<Web server IP address>/bank/login.php

5-3) id=1, password=1 입력하여, login

5-4) 각각의 page를 열어, 제대로 열리는가를 확인, error없이 열린다면 정상동작

 

Besim

요구사항

> Web Server와 동일

1) 1.에서 Besime(backend simulator??) 설치 : '/web2005-1.20/' 디렉토리에 설치됨.

 

2) '/web2005-1.20/Besim/Make_Readme' 정독!

우리는 fcgiPHP를 사용할 것임

 

3) fcgi 설치

3-1) '/web2005-1.20/Besim/fcgi-2.4.0/README' 정독

3-2) fcgi 설치 : '/web2005-1.20/Besim/fcgi-2.4.0/'에서 아래 command 입력

☞ …/fcgi] # ./configure

☞ …/fcgi] # ./make

☞ …/fcgi] # ./make install

EOR error 발생시 : ‘/fcgi-2.4.0/libfcgi/fcgio.cpp‘ '#include <stdio.h>' line 추가

4) Besim compile

4-1) '/web2005-1.20/Besim/‘Make_Readme 정독

4-2) 'besim_fcgi.fcgi'를 설치하기 위한 디렉토리 생성

☞ …/Besim] # mkdir /var/www/fcgi-bin/

4-3) Besim compile

☞ …/Besim] # make fcgi TARGET='clean all install' DEST=/var/www/fcgi-bin/

4-4) '/var/www/fcgi-bin/‘’Besim_fcgi.fcgi‘ 파일 생성 확인

 

 

5) mod_fastcgi.so 설치

5-1) httpd-devel 설치

☞ …] # yum install httpd-devel

5-2) mod_fastcgi 다운로드 및 설치 ( http://fastcgi.com/dist/ )

☞ …/mod_fastcgi] # cp Makefile.AP2 Makefile

☞ …/mod_fastcgi] # make top_dir=/usr/lib/httpd install

“/usr/lib/httpd/modules/” “mod_fastcgi.so“ 생성 확인

5-3) FastCGI에서 Unix socket 파일들을 저장하기 위한 디렉토리 생성 및 권한 설정

☞ …] # mkdir -p /etc/httpd/fastcgi

☞ …] # chmod 777 /etc/httpd/fastcgi

 

6) httpd 환경 설정

6-1) '/etc/httpd/conf/httpd.conf' 파일 수정

1> 아래 Line"Dynamic Shared Object(DSO) Support" section에 추가

: LoadModule fastcgi_module modules/mod_fastcgi.so

2> 아래 Line들을 “ScriptAlias /cgi-bin/" Line 바로 뒤에 추가

: ScriptAlias /fcgi-bin/ "/var/www/fcgi-bin/"

: FastCgiIpcDir /etc/httpd/fastcgi

3> 아래 Line들을 “<Directory "var/www/cgi-bin” ‘section’ 뒤에 추가

: <Directory "/var/www/fcgi-bin">

: AllowOverride None

: Options +ExecCGI -Includes

: SetHandler fastcgi-script

: Order allow, deny

: Allow from all

: </Directory>

: Addhandler fastcgi-script fcgi

4> DocumentRoot의 값을 아래와 같이 변경

: DocumentRoot "/"

5> 주석부분 “# This should be changed to whatever you set DocumentRoot to."아래의

값을 아래 Line과 같이 수정수정

: <Directory "/">

 

7) Besim 동작 test

7-1-1) apache(httpd) restart

☞ …] # service httpd restart

7-1-2) '/web2005-1.20/Besim/'에서, 'test_besim_bank.pl' 실행. 아래 command 입력.

☞ …/Besim] # perl test_besim_bank.pl http://<BesimIPaddress>:81/fcgi-bin/besim_fcgi.fcgi/

 

7-2) 브라우저를 통하여, http://<BesimIPaddress>:81/fcgi-bin/besim_fcgi.fcgi/접속

아래와 같은 page 출력 확인

 

에러가 발생한다면, 아래의 명령어로, message를 추적하여 수정할 것. Besim의 경우, httpd

error message를 통해서, 쉽게 문제점 추적이 가능함

☞ …] # tail -f /etc/httpd/logs/access_log

☞ …] # tail -f /etc/httpd/logs/error_log

Besimhttpd 환경설정 파일을 http://nclab.tistory.com/ 에서 다운로드 받을 수 있음

Client 설치

1) 1.에서 Client Prime Client를 설치: '/web2005-1.20/' 디렉토리에 설치됨

2) '/web2005-1.20/Harness/'에 있는 base 환경설정 파일들을 아래 command로 복사하여, 사용

각 환경파일들을 이용하여, SPECweb이 구동됨.

☞ …/Harness] # cp SPECweb_Banking.Unix-PHP.config SPECweb_Banking.config

☞ …/Harness] # cp SPECweb_Ecommerce.Unix-PHP.config SPECweb_Ecommerce.config

☞ …/Harness] # cp SPECweb_Support.Unix-PHP.config SPECweb_Support.config

☞ …/Harness] # cp Test.Unix-PHP.config Test.config

3) 위 복사한 파일들을 이용하여, SPECweb 옵션을 변경할 수 있음.

4) Test.config 필수 설정

CLIENTS = <client IP address>

SIMULTANEOUS_SESSIONS = <원하는 값>

&를 이용하여, 원하는 workload양과 순서 조절 가능.

> 100&500&200 : 100, 500, 200의 순서로, Runtime동안 workload 할당

<최소>-최대>x<step level>을 이용하여, 원하는 Step level단위로 workload 조절가능

> 100-200x50 : 100, 150, 200 의 순서로, Runtime동안 workload 할당

TEST_TYPE=SPECweb_<원하는 workload<

: 이후의 내용은 Banking을 기준으로 함 -> SPECweb_Banking

WEB_SERVER = <web server IP address>

BESIM_SERVER = < Besim IP address>

BESIM_PORT = 81

BESIM_INIT_SCRIPT = "/var/www/fcgi-bin/besim_fcgi.fcgi" # FCGI

SMARTY_DIR = "/var/www/html/Smarty-2.6.7/libs/"

SMARTY_BANK_DIR = "/var/www/html/bank/"

SMARTY_ECOMMERCE_DIR = "/var/www/html/ecommerce/"

SMARTY_SUPPORT_DIR = "/var/www/html/support/"

 

5) SPECweb_Bankig.config 필수 설정

IMG_PATH = "/bank/images"

DYN_SCRIPT_PATH = "/bank/"

PADDING_DIR = "/var/www/html/bank/dynamic_padding/"

CHECK_IMAGE_DIR = "/var/www/html/bank/images/"

 

6) Client 동작 test

Ping을 이용하여, Server, Besim과의 network 연결상태 확인

 

7) Client Prime client 동작 명령 ( terminal 2개 필요)

7-1) client

☞ …/Harness] # java -jar specwebclient.jar

7-2) Prime client

☞ …/Harness] # java -jar specweb.jar

 

에러가 발생한다면, ‘Test.config’ 파일내의 ‘DEBUG_LEVEL’10을 할당한다. 그 후, Client Prime client를 다시 실행시키면, 상세한 실행과정이 출력된다. 이 과정의 message를 통하

여 에러의 원인을 비교적 쉽게 알아낼 수 있다.

 

SPECweb2005 구동

구동 절차

1) Web server에서, Apache(httpd) 시작

☞ …] # service httpd start

 

2) Besim에서, Apahce(httpd) 시작

☞ …] # service httpd start

 

3) Client에서, Client 실행

☞ …/Harness] # java -jar specwebclient.jar

 

4) Client에서, Prime client 실행

☞ …/Harness] # java -jar specweb.jar

 

Tip

1) Test.config 주요변수 설명

SIMULTANEOUS_SESSIONS : 동작시킬 thread , 높을수록 더 많은 부하 발생

TEST_TYPE=SPECweb_Banking : 'SPECweb_Banking.config'파일을 이용하여, Simulate

THREAD_RAMPUP_SECONDS : SPECweb2005SIMULTANEOUS_SESSIONS값까지 thread수를

끌어 올린 후, Simulation을 시작한다. 이 값은 thread를 끌어올리는데 걸리는 시간이다. 이 값이

클수록 서서히 thread를 증가시켜 최대값에 이르고, 작을수록 짧은 급격히 thread를 증가시켜 최대

값에 이른다.

THREAD_RAMPDOWN_SECONDS : TREAD_RAMPUP_SECONDS와 반대되는 값이다.

DEBUG_LEVEL : Prim client 실행시, 출력되는 정보의 세부정도를 결정하는 변수. 클수록 더 상세함.

RUN_SECONDS : 실제 Simulation 실행 시간. 초 단위.

ITERATIONS : Simulation의 반복 수.

2) SPECweb_Banking.config 주요변수 설명

THINK_TIME : request를 요청하는 interval.

√ USE_SSL : SSL을 사용 여부 결정. SPECweb에서 제공하는 문서(SPECweb2005_Design.html) 참조.

 

발생할 수 있는 오류

1) incorrec id password page 출력

원인 : Besim이 정상적으로 설치 되지 않았을 경우, 이러한 현상 발생.

해결책 : 위의 Besim 설치부분을 참고하여, Besim 재설치

 

2) ‘too many open files’ message 출력

원인 : 제한된 file수로 인해 발생

해결책 : ulimit를 이용하여 제한 변경.

☞ …] # ulimit -a >> 정보 출력

☞ …] # ulimit -s [] >> stack size 변경

항상 적용되기 위해서, 사용된 명령어를 쉘 스크립트에 추가, “/root/.bashrc”

 

3) 'Exceeded allowed max thinktime ' message 출력

원인 : workload의 양이 server가 감당할 수 없을 정도로 많을 경우, 발생.

해결책 : Test.config에서, SIMULTANEOUS_SESSIONS값을 줄이거나,

SPECweb_Banking.config에서, THINK_TIME값을 늘려준다.

 

 

 

 

 

SPECweb2005 설치과정

2011. 1. 26. 12:11

1. 테스트 환경 구축

1-1. BeSim Web Server
환경 구축

(1) 구성

linux

종류, 버전은 상관없음. (fedora 14)

설치>

생략.

java sdk

버전 상관없음. (java-1.6.0_20)

설치>

root@BeSim$ yum install *java*

web server

종류, 버전 상관없음. (fedora 기본 웹서버 : apache 2.2)

설치>

기본적으로 설치되어 있음. (/etc/httpd/, /usr/lib/httpd/)

mod_fastcgi.so

Fedora에선 제공하지 않음. 소스를 받아 설치. (mod_fastcgi-2.4.6)

설치>

밑에서 설명. (4-2) mod_fastcgi.so 설치)

(2) SPECweb2005 소프트웨어 설치.

root@BeSim$ java -jar setup.jar -i console
선택
: 전체 설치 또는 BeSim 설치

(3) BeSim Web ServerPort 번호를 바꿈.

root@BeSim$ vi /etc/httpd/conf/httpd.conf
Listen 80 -> Listen 81 

(4) BeSim Web Server 구동을 위한 FastCGI 설치.

(4-1) fastCGI Compiling

root@BeSim$ cd /web2005-1.20/Besim/fcgi-2.4.0

root@BeSim$ ./configure --libdir=/lib
->configure 과정에서 상당한 에러가 나옴. 해결이 안 되는 것들은 무시.

root@BeSim$ make
-> make 과정에서 fcgio.cpp에서 에러가 나옴.

root@BeSim$ vi /web2005-1.20/Besim/fcgi-2.4.0/libfcgi/fcgio.cpp
-> #include <cstdio> 추가.

root@BeSim$ make install

root@BeSim$ mkdir /var/www/fcgi-bin

root@BeSim$ cd /web2005-1.20/Besim

root@BeSim$ make fcgi TARGET='clean all install' DEST=/var/www/fcgi-bin/

(4-2) mod_fastcgi.so 설치

root@BeSim$ yum install httpd-devel
다음 사이트에서 (http://www.fastcgi.com/dist/) 소스를 다운로드 받아 압축을 풀고, 압축을 푼 디렉토리에서 다음 명령어를 입력.

root@BeSim$ apxs -n mod_fastcgi -i -a -c mod_fastcgi.c fcgi_buf.c fcgi_config.c fcgi_pm.c fcgi_protocol.c fcgi_util.c

root@BeSim$ ls -l /usr/lib/httpd/mod_fastcgi.so
-> /usr/lib/httpd/modules/ 디렉토리에 mod_fastcgi.so가 있는지 확인.

root@BeSim$ mkdir -p /etc/httpd/fastcgi

root@BeSim$ chmod 777 /etc/httpd/fastcgi

(4-3) httpd.conf 파일 수정

root@BeSim$ vi /etc/httpd/conf/httpd.conf
1)
Dynamic Shared Object Support -> LoadModule fastcgi_module modules/mod_fastcgi.so
추가.

2)
ScriptAlias /cgi-bin/ -> ScriptAlias /fcgi-bin/ "/var/www/fcgi-bin/"
FastCgiIpcDir /etc/httpd/fastcgi

3)
<Directory "<CGIDIR>/fcgi-bin">
AllowOverride None
Options +ExecCGI -Includes
SetHandler fastcgi-script
Order allow,deny
Allow from all
</Directory>

4)
AddHandler fastcgi-script fcgi

1-2. Web Server 환경 구축

(1) 구성

linux

종류, 버전은 상관없음. (fedora 13)

설치>

생략.

java sdk

버전 상관없음. (java-1.6.0_20)

설치>

root@Web$ yum install *java*

web server

종류, 버전 상관없음. (fedora 기본 웹서버 : apache 2.2)

설치>

기본적으로 설치되어 있음. (/etc/httpd/, /usr/lib/httpd/)

PHP

버전 상관없음.

설치>

root@Web$ yum install *php*

mod_ssl

버전 상관없음.

설치>

root@Web$ yum install *ssl*

(2) SPECweb2005 소프트웨어 설치.

root@Web$ java -jar setup.jar -i console
선택 : Web Server 설치

(3) 스크립트 콘텐츠 복사.

root@Web$ cp -ar /SPECweb2005/scripts/php/* /var/www/
-> bank, ecommerce, support, Smarty-2.6.7 디렉토리

root@Web$ chmod 777 /bank /ecommerce /support /Smarty-2.6.7
-> 디렉토리 퍼미션 설정

root@Web$ chown -R nobody.nobody /bank /ecommerce /support /Smarty-2.6.7
-> 디렉토리 권한 변경 (root->nobody)

(4) php.ini 파일 수정.

root@Web$ vi /etc/config

1)
display_errors=On

2)
display_setup_errors=On

3)
error_reporting=E_ALL

(5) Wafgen 설정.

root@Web$ vi /web2005-1.20/wafgen/unix/<script_name>.rc
->각 스크립트의 .rc파일에서 수정. (script_name=bank, ecommerce, support)

1)
SIMULTANEOUS_SESSIONS=1 ->
숫자 조정. (1=10MB)

2)
DOCROOT=/var/www 
 

root@Web$ cd /web2005-1.20/wafgen

root@Web$ ./Wafgen unix/<script_name>.rc
-> 수정된 각 스크립트 .rc를 적용.

(6) httpd.conf 파일 수정

root@Web$ vi /etc/httpd/conf/httpd.conf
DocumentRoot=/var/www

1-3. 클라이언트 환경 구축

(1) Windows에서 설치

(1-1) JVM 설치

http://www.java.sun.com/

(1-2) SPECweb2005 소프트웨어 설치.

root@client$ java -jar setup.jar -i console
선택 : client/prime client 설치.

(2) Linux에서 설치

(2-1) Java sdk 설치

root@client$ yum install *java*

(2-2) SPECweb2005 소프트웨어 설치.

root@client$ java -jar setup.jar -i console
선택 : client/prime client 설치.

(3) .config 파일 수정

root@client$ cd /web2005-1.20/Harness/
-> Client 디렉토리로 이동

root@client$ cp SPECweb_<script_name>.Unix-PHP.config SPECweb_<script_name>.config
-> 각 스크립트 설정파일을 다른 이름으로 저장.

root@client$ vi SPECweb_<script_name>.config
-
> 다른 이름으로 저장된 각 스크립트 설정파일의 내용 수정.

PADDING_DIR = "/var/www/<script_name>/dynamic_padding/"

root@client$ cp Test.Unix-PHP.config Test.config
-> Test 설정파일을 다른 이름으로 저장.

root@client$ vi Test.config
-> 다른 이름으로 저장된 Test 설정파일의 내용 수정.

1)
WEB_SERVER = Web Server
IP 주소 

2)
BESIM_SEVER = BeSim Web Server
IP 주소

3)
BESIM_INIT_SCRIPT = "/var/www/fcgi-bin/besim_fcgi.fcgi"

4)
SMARTY_DIR = "/var/www/Smarty-2.6.7/libs/"
SMARTY_BANK_DIR = "/var/www/bank/"
SMARTY_ECOMMERCE_DIR = "/var/www/ecommerce/"
SMARTY_SUPPORT_DIR = "/var/www/support/" 

2. 실행

2-1. BeSim Web Server 실행

root@BeSim$ /etc/init.d/iptables stop
-> 방화벽 해제.

root@BeSim$ /etc/init.d/httpd start
-> 웹 서버 실행.

2-2. Web Server 실행

root@Web$ /etc/init.d/iptables stop
-> 방화벽 해제.

root@Web$ /etc/init.d/httpd start
-> 웹 서버 실행.

2-3. Client 실행

root@client$ /etc/init.d/iptables stop
-> 방화벽 해제.

root@Client$ java -jar SPECwebclient.jar

2-4. Prime Client 실행

root@prime$ /etc/init.d/iptables stop
-> 방화벽 해제.

root@Prime$ java -jar SPECweb.jar

 

 

1. 목적

기존의 부하분산 알고리즘은 Apache bench를 이용했었지만, Apache bench는 패턴이 일정하기 때문에 실제 web의 상태와 많은 차이가 있다. 그래서 실제 web과 동일한 환경을 구축하기 위해 SPECWeb이라는 벤치마킹 툴을 이용한다. SPECWeb의 본래 기능은 말 그대로 web server의 벤치마킹을 목적으로 한다. , web server의 성능을 평가하는 도구인 셈이다. 하지만 우리는 이 벤치마킹 툴을 통해 실제 web 환경을 구현, 또는 구축을 하려고 한다. 그리고 개발하려는 에너지 기반 부하분산 알고리즘의 성능을 기존의 부하 분산 알고리즘의 성능과 비교하여 더 좋은 알고리즘을 개발하는데 목적이 있다.

2. SPECweb2005

SPECweb의 버전 중 2005버전을 사용한다. 이는 실제 환경과 같은 환경을 구현하기 위해 작업 부하 환경을 3가지(banking, ecommerce, support)로 디자인 되었다. 각 환경은 웹 서버의 설정에 따라 다양한 환경을 갖출 수 있다.

3. SPECweb2005의 구성

SPECweb2005는 클라이언트, Prime client, 웹 서버, BeSim 으로 구성된다.

각 구성요소의 간략한 설명은 다음과 같다.

Client

서버에 HTTP 요청을 보내고 서버에서 HTTP 응답을 받은 응용 프로그램이 실행된다.

Prime Client

다른 클라이언트들을 초기화하고 행동을 통제하며, 웹 서버 및 BeSim에 대하여 초기화 루틴을 가동시키고, 벤치마크 시험의 결과를 모아 저장하는 역할을 한다.

Web Server

하드웨어와 클라이언트가 요청한 요구를 클라이언트들로부터 정보를 수집하는 것이다.

BeSim

(Back-end Simulator)

웹 서버가 HTTP 응답을 완료하기 위해 필요로 하는 특정의 정보를 회수하기 위해 통신을 해야 하는 back-end 과정에 필요한 적용 서버를 에뮬레이트 하는데 필요하다. , Besim 타입의 웹 서버와 back-end 과정에 필요한 서버 사이의 통신을 에뮬레이트 하기 위해 존재한다.


SPECweb 웹 사이트 주소
http://www.spec.org/
 
작성자 : 김호연


교재: ARM으로배우는 임베디드 시스템



목차 
¨부트로더의 이해
¨U-Boot 빌드와 설치
¨U-Boot 활용
¨U-Boot 포팅



요약
부트로더인 U-Boot의 기능 및 특징을 살펴보고,
Porting 과정을 전체적으로 살펴 본다.
 
발표일시 : 2011.01.04(화)
발표자 : 김동준
발표내용:

ARM 교차 개발 툴
ARM 컴파일러의 레지스터 사용
오브젝트 파일의 자료 구조
링커와 로케이터
메모리 제어기와 물리 주소 할당
소프트웨어 동작을 위한 메모리 구조

'BooK > ARM으로 배우는 임베디드 시스템' 카테고리의 다른 글

Chapter 15. 부트로더 개발  (0) 2011.01.07
 

발표일시 : 2011.01.03(월)
발표자 : 김석구
발표내용:
 
¨ 시동
¨ 커널모드와 유저모드
¨ 프로세스 문맥과 언터럽트 문맥
¨ 커널 타이머
¨ 커널 동시성
¨ 프로세스 파일 시스템
¨ 메모리 할당하기

첨부파일 : ppt, hwp

'BooK > 코드로 읽는 디바이스 드라이버' 카테고리의 다른 글

3장 커널 기능 -강남용-  (1) 2011.01.05
 

3장 커널 기능 -강남용-

2011. 1. 5. 13:01
발표일시 : 2011.01.03(월)
발표자 : 강남용
발표내용:

커널 스레드
- 스레드란?
- 스레드 종류
도우미 인터페이스
- 연결 리스트
- 해시 리스트
- 작업 큐
- 통지 연쇄
- 완료 인터페이스
- kthread  도우미
- 오류 처리 지원

첨부파일 : ppt, pdf
 
LVS
/*
 * Building: cc -o com com.c
 * Usage   : ./com /dev/device [speed]
 * Example : ./com /dev/ttyS0 [115200]
 * Keys    : Ctrl-A - exit, Ctrl-X - display control lines status
 * Darcs   : darcs get http://tinyserial.sf.net/
 * Homepage: http://tinyserial.sourceforge.net //원작자 사이트
 * Version : 2009-03-05
 *
 * Ivan Tikhonov, http://www.brokestream.com, kefeer@brokestream.com
 * Patches by Jim Kou, Henry Nestler, Jon Miner, Alan Horstmann
 *
 */


/* Copyright (C) 2007 Ivan Tikhonov

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

  Ivan Tikhonov, kefeer@brokestream.com

*/

#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>

int transfer_byte(int from, int to, int is_control);

typedef struct {char *name; int flag; } speed_spec;


void print_status(int fd) {
int status;
unsigned int arg;
status = ioctl(fd, TIOCMGET, &arg);
fprintf(stderr, "[STATUS]: ");
if(arg & TIOCM_RTS) fprintf(stderr, "RTS ");
if(arg & TIOCM_CTS) fprintf(stderr, "CTS ");
if(arg & TIOCM_DSR) fprintf(stderr, "DSR ");
if(arg & TIOCM_CAR) fprintf(stderr, "DCD ");
if(arg & TIOCM_DTR) fprintf(stderr, "DTR ");
if(arg & TIOCM_RNG) fprintf(stderr, "RI ");
fprintf(stderr, "\r\n");
}


int main(int argc, char *argv[])
{
int comfd;
struct termios oldtio, newtio;       //place for old and new port settings for serial port
struct termios oldkey, newkey;       //place tor old and new port settings for keyboard teletype
char *devicename = argv[1];
int need_exit = 0;
speed_spec speeds[] =
{
{"1200", B1200},
{"2400", B2400},
{"4800", B4800},
{"9600", B9600},
{"19200", B19200},
{"38400", B38400},
{"57600", B57600},
{"115200", B115200},
{NULL, 0}
};
int speed = B9600;

if(argc < 2) {
fprintf(stderr, "example: %s /dev/ttyS0 [115200]\n", argv[0]);
exit(1);
}

comfd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (comfd < 0)
{
perror(devicename);
exit(-1);
}

if(argc > 2) {
speed_spec *s;
for(s = speeds; s->name; s++) {
if(strcmp(s->name, argv[2]) == 0) {
speed = s->flag;
fprintf(stderr, "setting speed %s\n", s->name);
break;
}
}
}

fprintf(stderr, "C-a exit, C-x modem lines status\n");

tcgetattr(STDIN_FILENO,&oldkey);
newkey.c_cflag = B9600 | CRTSCTS | CS8 | CLOCAL | CREAD;
newkey.c_iflag = IGNPAR;
newkey.c_oflag = 0;
newkey.c_lflag = 0;
newkey.c_cc[VMIN]=1;
newkey.c_cc[VTIME]=0;
tcflush(STDIN_FILENO, TCIFLUSH);
tcsetattr(STDIN_FILENO,TCSANOW,&newkey);


tcgetattr(comfd,&oldtio); // save current port settings 
newtio.c_cflag = speed | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(comfd, TCIFLUSH);
tcsetattr(comfd,TCSANOW,&newtio);

print_status(comfd);
    
while(!need_exit) {
fd_set fds;
int ret;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
FD_SET(comfd, &fds);


ret = select(comfd+1, &fds, NULL, NULL, NULL);
if(ret == -1) {
perror("select");
} else if (ret > 0) {
if(FD_ISSET(STDIN_FILENO, &fds)) {
need_exit = transfer_byte(STDIN_FILENO, comfd, 1);
}
if(FD_ISSET(comfd, &fds)) {
need_exit = transfer_byte(comfd, STDIN_FILENO, 0);
}
}

    }

tcsetattr(comfd,TCSANOW,&oldtio);
tcsetattr(STDIN_FILENO,TCSANOW,&oldkey);
close(comfd);

return 0;
}


int transfer_byte(int from, int to, int is_control) {
    char c;
int ret;
do {
ret = read(from, &c, 1); 
} while (ret < 0 && errno == EINTR);
if(ret == 1) {
if(is_control) {
if(c == '\x01') { // C-a
return -1;
} else if(c == '\x18') { // C-x
print_status(to);
return 0;
}
}
while(write(to, &c, 1) == -1) {
if(errno!=EAGAIN && errno!=EINTR) { perror("write failed"); break; }
}
} else {
fprintf(stderr, "\nnothing to read. probably port disconnected.\n");
return -2;
}
   struct tm *time_struct;
    time_t local;

    (void)time(&local);
    time_struct=localtime(&local);
    FILE *fp;
    fp =fopen("watt.txt", "a+");
  if(c == '\r'){fprintf(fp, "[%02d-%02d-%02d %02d:%02d:%02d] ",time_struct->tm_year+1900,time_struct->tm_mon+1, time_struct->tm_mday, time_struct->tm_hour, time_struct->tm_min, time_struct->tm_sec);}
       else{fprintf(fp, "%c", c);}
    fclose(fp);
  
    return 0;
}



Download: com.c   // <------- 원본 소스
Building: cc -o com com.c
Usage   : ./com /dev/device [speed]  // <-------- 사용방법
Example : ./com /dev/ttyS0 [115200]   //<-------- 예를들어서 이렇게( HPM-100A  경우 .com /dev/ttyUSB0 [9600]
Keys    : Ctrl-A - exit, Ctrl-X - display control lines status
Darcs   : darcs get http://tinyserial.sf.net/
Scr.shot: screenshot.png (8862 bytes)
형광펜 부분이 추가해준 소스 입니다.
추가해준 내용은 TIME 정보를 추가해주었습니다.
S //  start 
22003Vo //전압
10003Am //전류
22002Wa //와트
10001Pf //역률
60001Hz //주파수
E //  end
[2010-01-01 01:01:01] //시간

실제 실행 결과 
S:  21693Vo:  42412Am:  46461Wa:     21Wh:   5051Pf:  59981Hz:     01Kg:     01Eu  E[2011-01-05 07:57:32] 
S:  21693Vo:  42422Am:  46481Wa:     31Wh:   5051Pf:  59981Hz:     01Kg:     01Eu  E[2011-01-05 07:57:33] 
S:  21693Vo:  42422Am:  46481Wa:     31Wh:   5051Pf:  59971Hz:     01Kg:     01Eu  E[2011-01-05 07:57:33] 
S:  21693Vo:  42432Am:  46461Wa:     41Wh:   5041Pf:  59971Hz:     01Kg:     01Eu  E[2011-01-05 07:57:34] 




추가한 소스 분석
(형광펜 부분)
#include <time.h>  // 시간 함수를 사용하기 위한  header 파일
struct tm *time_struct;
/*
struct tm  //  time.h에 정의되어있는 tm  구조체 내부
134 {
135   int tm_sec;           /* Seconds. [0-60] (1 leap second) */
136   int tm_min;           /* Minutes. [0-59] */
137   int tm_hour;          /* Hours.   [0-23] */
138   int tm_mday;          /* Day.     [1-31] */
139   int tm_mon;           /* Month.   [0-11] */
140   int tm_year;          /* Year - 1900.  */ // 1990년 이후 경과 년수를 의미한다,
141   int tm_wday;          /* Day of week. [0-6] */ // 0은 일요일 ~ 6은 토요일을 의미
142   int tm_yday;          /* Days in year.[0-365] */
143   int tm_isdst;         /* DST.     [-1/0/1]*/
144 
145 #ifdef  __USE_BSD
146   long int tm_gmtoff;       /* Seconds east of UTC.  */
147   __const char *tm_zone;    /* Timezone abbreviation.  */
148 #else
149   long int __tm_gmtoff;     /* Seconds east of UTC.  */
150   __const char *__tm_zone;  /* Timezone abbreviation.  */
151 #endif
152 };
*/
time_t local;  //  time_t 시분초일월을 모두 숫자로 압축한 시간 전용 자료형이다.

(void)time(&local); //1970년 1월 1일 0시 후 경과된 초를 조사합니다.
 time_struct=localtime(&local); // time_t 형의 값을  tm  구조체형태로 변환 시켜준다.
 FILE *fp;
 fp =fopen("watt.txt", "a+"); //파일을 열되 마지막 위치한 부분부터 추가
 if(c == '\r'){ //엔터의 아스키 코드값이 '\r'이 들어오면 실행하라는 의미
//현재 시간을 연산해서 보여준다.
fprintf(fp, "[%02d-%02d-%02d %02d:%02d:%02d] ",time_struct->tm_year+1900,time_struct->tm_mon+1, time_struct->tm_mday, time_struct->tm_hour, time_struct->tm_min, time_struct->tm_sec);}
else{     
fprintf(fp, "%c", c);  //시리얼 통신으로 들어오는 문자를 파일에 저장해준다.
}
    fclose(fp);
 
LVS
안녕하세요, 오늘은 LVS  부하 분산 방법 중 DR을 설정하는 법에 대해 알아보겠습니다.

1. LVS 설정

1.1. VIP 및 DIP 설정

LVS에서는 크게 DIP (Director IP)와 VIP (Virtual IP)를 설정해야 한다. 여기에서 DIP는 LVS가 고유하게 가질 IP 주소로서, NIC의 기본 IP 주소가 된다. 반면 VIP는 외부 Clients에게 서비스를 제공하기 위해 사용될 인터페이스 IP 주소 (즉, 외부 Clients가 접속할 IP 주소)로서, Aliasing을 통해 설정할 수 있으며, 부하를 상호 분산할 Real Server도 이 VIP를 반드시 가져야 한다.

따라서, 우선 VIP가 123.234.1.101 이고, DIP가 123.234.1.102 이라고 가정할 때,

># ifconfig eth0 123.234.1.102 netmask 255.255.255.0 up
># ifconfig eth0:1 123.234.1.101 netmask 255.255.255.0 up

위와 같이, ifconfig 명령을 이용하여 VIP와 DIP를 각각 설정한 다음, ifconfig로 설정사항을 확인한다. 단, 이미 eth0에 DIP가 설정되어 있는 경우가 대부분이므로, 이 단계에서는 VIP 만을 설정해도 된다.


1.2. Packet Forwarding 활성화

Dispatcher는 Client로부터 전송된 요청 메시지를 Real Server로 전달해야 하므로, 반드시 Packet Forwarding 기능이 활성화되어 있어야 한다. 이는 proc의 ip_forward의 값을 1로 설정함으로써 가능하다.

># echo 1 >/proc/sys/net/ipv4/ip_forward


1.3. Virtual Service 등록 (IPVSADM 설정)

># ipvsadm -A -t 123.234.1.101:80 -s rr



2. Real Server 설정


2.1. ARP Problem 해결 : ARP Hidden

패킷 전달 방식에 있어 NAT를 제외한 TUN 및 DR 방식은 모두 ARP Flux Problem을 해결해야 한다. 기본적으로 Dispatcher Node와 Real Server 모두 VIP를 갖고 있기 때문에, 클라이언트가 VIP의 MAC 주소를 묻는 ARP Request를 전송했을 때 Dispatcher와 Real Server 모두 이에 응답하게 되면 클라이언트는 이들 중 특정 서버의 MAC 주소를 해당 VIP에 해당하는 MAC 주소로 기억(ARP Caching)하고는 이 서버에게만 모든 서비스 요청 메시지를 전송한다. 결국 부하 분산을 더 이상 제공할 수 없으며, 임의의 클라이언트가 어떤 서버로부터 서비스를 제공받는지 관리할 수 없다.

결국 이를 해결하기 위해서는 클라이언트가 ARP 요청 메시지를 전송했을 때 Dispatcher만이 이에 응답하고, Real Server는 모두 ARP 요청 메시지를 무시해야 한다. 여기에서는 가장 간단한 ARP Hidden 방식을 소개한다.

일반적으로 Real Server에 VIP는 lo 장치에 Aliasing으로 설정되기 때문에, lo 장치와 다른 모든 인터페이스에 대해 ARP를 무시하도록 설정한다.

># echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
># echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
># echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
># echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce

 
2.2. VIP 및 RIP 설정

Real Server는 고유의 IP 주소인 RIP (Real Server IP)를 갖고 있으며, Dispatcher는 RIP 주소를 기반으로 서비스 요청을 분산시킨다. 다만, Direct Routing 방식의 특성상 처리된 클라이언트의 요청은 Real Server에서 클라이언트로 직접 전달되므로(NAT 방식에서 Dispatcher를 거치는 것과는 달리), Real Server는 VIP 주소도 함께 lo 장치로서 갖고 있어야 한다. 따라서, 우선 VIP가 123.234.1.101 이고, RIP가 123.234.1.111 이라고 가정할 때,

># ifconfig eth0 123.234.1.111 netmask 255.255.255.0 up
># ifconfig lo:0 123.234.1.101 netmask 255.255.255.255 up
># ifconfig

위와 같이, ifconfig 명령을 이용하여 VIP와 RIP를 각각 설정한 다음, ifconfig로 설정사항을 확인한다. 단, 이미 eth0에 RIP가 설정되어 있는 경우가 대부분이므로, 이 단계에서는 VIP 만을 설정해도 된다.


2.3. Routing Table 설정

lo:0 장치에 VIP를 설정했으므로, Destination이 VIP인 요청 메시지를 lo:0 장치로 전달해야 한다. 그런 다음에는 이를 Real Server의 커널에 의해 처리된다.

># route add -host 123.234.1.101 dev lo:0

 

3. Real Server를 Virtual Service에 등록 (on Dispatcher Node)


3.1. Real Server를 등록하기

일반적인 Real Server를 Virtual Service에 등록하는 방식도 위와 동일하다. 다만 local host 대신 RIP를 입력하는 것만 차이가 있다.

># ipvsadm -a -t 123.234.1.101:80 -r 123.234.1.111 -g

 

4. Virtual Service 상태 모니터링


이상과 같이 Virtual Service에 Real Server가 등록된 이후에는 즉시 VIP를 통한 서비스 제공이 가능하다. 이때 Dispatcher Node에서 주기적으로 서비스 상태(# of Active Connection and # of Inactive Connection)를 계속해서 모니터링하고 싶은 경우 watch 명령을 이용한다.

># watch n -1 ipvsadm -Ln

 

New Post