P/W : forgetMe!
* TCP_DEFER_ACCEPT
클라이언트가 TCP 연결 수행시 서버단에서 실제 데이타가 수신되기 전까지 곧바로 ESTABLISHED 를 수행하지
않고 기다리는 소켓 옵션 설정값이다. 구현의 목적은 실제 전송 패킷 수의 감소 그로 인한 지연 감소 그로 인한
성능 향상 목적등이 되겠다. TCP_DEFER_ACCEPT는 리눅스에서의 이름이고 같은 수행을 하는 옵션들이
다른 운영체제에서도 이름은 다르지만 존재하고 있다. 그리고 서버단이 아닌 리눅스 클라이언트단에서도
설정 가능하다.(마지막 ACK를 전송하지 않게 되는..즉 data와 함께 ACK flag 설정을 보내게 되는...)
리눅스에서의 사용은 밑처럼 하면 된다.
setsockopt(sock, SOL_TCP, TCP_DEFER_ACCEPT, &timeout, sizeof(int));
timeout 인자는 3 way handshake 후에 서로의 ACK 패킷 미응답시의 timeout 설정을 의미하는것처럼 보인다.
실제 연결후 아무것도 하지 않아도 설정 시간(second)에 반응(timeout)하지 않는다.
3-way handshake 후에도 ACK 는 일정 주기로 주고 받고 있을 테니까...
그리고 Linux Kernel에서 TCP_DEFER_ACCEPT 옵션의 timeout 설정시 우리의 설정 시간을 무시 할 만한
어느정도 최소한의 timeout이 설정되어 있는 것으로 보인다.
linux 2.6.x kernel 의 net/ipv4/tcp.c 를 보면 밑의 부분이 보인다.
[root@bando kernel-source]# vi net/ipv4/tcp.c
case TCP_DEFER_ACCEPT:
.
.
if (val > 0) {
val > ((TCP_TIMEOUT_INIT / HZ)...
.
.
서버 애플리케이션에 TCP_DEFER_ACCEPT 옵션 적용후 nc, telnet 등으로 서버에 접속하고 아무런 행위도 하지 않으면 ESTABLISHED 되지 않고 SYN_RECV 로 나오게 된다. Maxclient를 50으로 설정한 Apache의 경우 TCP 연결 500개를 확립하고 아무런 행위도 하지 않을시에 실제 정상적인 HTTP 처리는 아무런 문제없이 진행 된다.
.
.
[root@bando ~]# netstat -an|grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:80 127.0.0.1:54623 SYN_RECV
[root@bando ~]# man tcp
.
.
TCP_DEFER_ACCEPT
Allows a listener to be awakened only when data arrives on the socket. Takes an integer value
(seconds), this can bound the maximum number of attempts TCP will make to complete the connec-
tion. This option should not be used in code intended to be portable.
.
.
-----------------------------------------------------------------------------------------------------------------------
밑은 관련된 기사의 내용이다.
해석이 맞나? ^^ 그냥 원문 보는게...
하여간 내가 원하는 중요한 내용은 파란색 부분이다.
-----------------------------------------------------------------------------------------------------------------------
기사원문 : http://articles.techrepublic.com.com/5100-10878_11-1050771.html
Take advantage of TCP/IP options to optimize data transmission
TCP_DEFER_ACCEPT
첫번째 옵션 우리는 TCP_DEFER_ACCEPT 을 생각해볼 것이다. (Linux상에서 불려지는 것이다; 다른 OS들은 같은 옵션이지만 다른이름을 사용해서 제공한다.)TCP_DEFER_ACCEPT의 아이디어를 이해하는것은, HTTP client와 server 간 통신의 전형적인 진행 그림을 필요로 한다. data 전송을 위해 연결이 확립되는 TCP를 잘 생각해봐라.TCP가 데이타 전송의 목적을 위해 연결이 어떻게 확립되어지지 생각해봐라. 네트워크상에서 정보는 IP 패킷(또는 IP 데이타그램)이라고 불려지는 각각의 조각들로 이동된다. 한 패킷은 항상 한개의 헤더를 가지는데 헤더는 서비스 정보를 운반하고, 인터넷 프로토콜을 핸들링하기위해 사용하고, 적재된 데이타를 운반하기도 한다. 서비스 정보의 대표적인 예제는 flag들 이라고 불려지는 한 set 인데 그것은 성공적인 패킷 수신의 acknowledgement처럼 한 TCP/IP 스택을 특별한 의미를 가지도록 패킷들을 표시한다. 종종, 그것은 "표시된" 패킷들중에 payload 운반을 가능하게도 하지만, 때때로 내부 로직은 TCP/IP 스택이 헤더와 함께 올바르게 패킷들이 보내지는 것을 강요하기도 한다. 이 패킷들은 종종 필요없는 지연들 그리고 오버해드를 가중시키거나 그리고 전체 성능 하락의 결과를 만들어 내기도 한다.
서버가 지금 한 소켓이 생성되어졌고 한 연결을 위해 기다리는 중이다. TCP/IP 에서 그 연결 순서는 3-way handshake 라고 불려진다. 첫번째, 클라이언트는 SYN 플래그 설정과 함께 payload는 제외하고 한TCP 패킷(한 SYNC 패킷)을 보낸다. 서버는 첫 패킷의 acknowledge 받고 SYN/ACK 플래그 설정과 함께 한 패킷(한 SYN/ACK 패킷)을 보내는것으로 응답한다. 클라이언트는 그리고나서 두번째 패킷의 acknowledge 받고 한 ACK 패킷을 보내고 연결 순서가 완료된다. SYN/ACK 를 받은 후에, 패킷 서버는 receiver 프로세스가 작동하고 data를 기다리게 된다. 3-way handshake가 완료되어지면, 클라이언트는 서버에 전송되어질 "쓸모있는" 데이타를 보내는것을 시작한다. 보통, HTTP 요청은 매우 작고 단일 패킷에 적합하다. 그렇지만 이경우에, 적어도 4개의 패킷들이 적지않은 지연 시간과 함께 두곳 모두에서 보내질 것이다. 또한 주의해야 할것은 receiver 는 이미 그정보를 기다리는 중이었다 - 데이타가 보내지기 전에
옵션을 포함한다. server측에 listening socket 설정, 그것은 kernel은 마지막 ACK 패킷을
기다리지 않고 실제 data의 첫번째 패킷이 도착할때까지 그 프로세스를 시작하지 말라고 지시한다.
SYN/ACK를 보낸후에, 서버는 그리고 나서 클라이언트로부터 data 패킷을 위해 기다릴 것이다.
지금, 단지 3 패킷만이 네트워크상에 보내질 것이고 연결 확립 지연은 상당히 줄어들 것이다.
이것은 HTTP를 위해 대표적인것이다.
이옵션과 동등하게 마찬가지로 다른 운영체제에서도 사용가능하다. FreeBSD에서 예를 들면, 동일한 작동은 다음 코드와 함께 이루어진다.
/* some code skipped for clarity */
struct accept_filter_arg af = { "dataready", "" };
setsockopt(s, SOL_SOCKET, SO_ACCEPTFILTER, &af, sizeof(af));
이것은 FreeBSD에서 "accept fillter"를 호출해서, 다른 방법으로 사용되어진다.모든경우에도, 그 효과는TCP_DEFER_ACCEPT와 동일하다. 이것은 FreeBSD에서 "accept fillter"를 호출해서 다른 방법으로 사용하고 있긴 하지만 어떤경우라도 그 효과는 TCP_DEFER_ACCEPT와 동일하다. - 그 서버는 마지막 ACK 패킷을 기다리지 않고, payload 패킷이 전송되기만을 기다릴 것이다. 이 옵션에 대한 더 많은 정보 그리고 Web server의 높은 성능 을 위한 그것의 중요성은 Apache documentation 에서 확인 할 수 있다.
HTTP client-server 간 통신은, client의 행동을 변경하는 것을 필요로 할지도 모른다. 왜 클라이언트는 어떻게 해서든 이 "쓸모없는" ACK 패킷을 보내려고 하는가? 한 TCP 스택은 ACK 패킷의 상태를 알 방법이 없다. FTP가 HTTP대신에 사용된 경우에, 클라이언트는 FTP server 명령이 포함된 한 패킷을 받을때까지 어떤 데이타도 보내지 않을 것이다. 이경우에 지연된 ACK는 client-server 간 통신 지연의 원인이 될 것이다. 이 ACK가 필요한지를 결정하기 위해서 클라이언트는 그 애플레케이션의 프로토콜과 그것의 현재 상태를 알아야 한다. 이와같이 그것은 클라이언트의 행동을 변경하는것을 필요로 한다.
Linux 기반 클라이언트를 위해서, 우리는 또하나의 옵션을 사용할수 있는데 그것 또한 TCP_DEFER_ACCEPT라고 불려진다. socket에는 listening 그리고 connected 소켓 그리고 두 상응하는 옵션의 설정들을 가지는 두가지 타입이 있다.
따라서 그것은 종종 같이 사용되어지는 이 두 옵션을 위해 같은 이름을 사용하는 것이 가능하다. 연결되어진 소켓에 이옵션을 설정하게 되면, 클라이언트는 SYN/ACK 를 받은후에 ACK 패킷을 보내지 않을 것이고, 대신에 사용자 프로그램으로부터 데이타를 보내기 위해서 다음 요청을 기다릴 것이다; 따라서 서버는 한개 적은 패킷을 보내게 될 것이다.
TCP_QUICKACK
쓸모없는 패킷들이 보내지는것에 의한 원인으로 지연이 생기는것을 막기위한 다른 방법은 TCP_QUICKACK를 사용하는 것이다. 이 옵션은 TCP_DEFER_ACCEPT와 다른 것인데, 말하자면 그것은 연결 확립의 진행을 관리하는것 뿐만 아니라, 보통 데이타 전송 진행중에도 사용되어질수 있다. 게다가, 그것은 client-server 연결의 어느쪽에도 설정 될 수 있다.
ACK 패킷의 전송을 지연하는것은 사용자 데이타가 곧 전송되어질 것이라는 것을 알고 있을때 유용하고, 그것은 오버헤드를 최소화 하기 위해 데이타 패킷에 ACK 플래그 설정하는 것이 낫다. 송신자가 데이타가 곧 보내질(multiple packets) 것이라고 확신하면, TCP_QUICKACK 옵션은 0으로 설정 할 수 있다. 이 옵션의 기본 값은 "connected" 상태 소켓들을 위해서 1이고, 그 값은 처음 사용하고나서 kernel에 의해서 곧장 1로 reset 될 것이다.(이것은 1회성 옵션이다.)
이 경우에, 그것은 ACK 패킷들을 보내는 것이 유리 할 수 있다. ACK 패킷은 data 블럭의 수신을 확인 할 것이고, 다음 블럭이 처리되어질때, 지연은 발생하지 않을 것이다. 이 데이타 전송 방법은 사용자 입력의 순간을 예측 할 수 없는 위치에 있는 양방향 통신 진행을 위해 대표적이다. Linux에서 이것은 기본적인 소켓 행동으로 알려져있다.
앞서말한 상황에서, 클라이언트는 HTTP 요청을 서버에 보내고, 서버는 이미 그 요청 패킷은 짧고 연결이 확립되어진 후에 곧장 보내질 것이라는 것을 알고 있다는 것과 HTTP가 어떻게 작동하는지 보여줬다. 비어있는 ACK 패킷을 보내는것은 필요하지 않기 때문에 성능 향샹을 위해서 TCP_QUICKACK를 0으로 설정하는 것은 적절하다. 서버측에서, 두 옵션 모두 listening 소켓에 한번만 설정 할 수 있다. Accept 호출에 의해 간접적으로 생성되어진 모든 소켓들은 원래 소켓으로부터 모든것을 상속 받게 될 것이다.
TCP_CORK, TCP_DEFER_ACCEPT 그리고 TCP_QUICKACK 옵션들의 결합으로 각 HTTP 트랜잭션에 참여하는 패킷들의 수가 최소한의 허용 가능함 범위로 줄어들 것이다(TCP 프로토콜 요구조건과 보안 고려사항들이 요구하는 대로). 그 결과 데이타 전송 과 요청 진행과정이 빨라지는 것 뿐만 아니라 client-server 송수신 잠재까지 최소화 한다.
Conclusion
네트워크 프로그램 성능의 최적화는 복잡하고 힘든일임에는 분명하다. 최적화 기술은 어디에서나 접근 가능한 zero-copy를 사용하는 것, TCP_CORK에 의해 조합된 올바른 패킷 그리고 상응하게전송되어지는 패킷들의 수의 최소화 그리고 잠재 최적화를 포함한다.
성능 과 확장성에 어느정도 의미있는 증가를 위해 그것은 이용할 수 있는 모든 방법들의 조합과 코드에 걸쳐 일관되게 사용하는 것이 필요하다. 물론 더하여, TCP/IP 스택의 내부 동작과 OS 전반에 걸쳐 명확한 이해는 필요하다.
1. Overview of dmidecode
Distributed Management Task Force maintains the DMI specification and SMBIOS specification. The output of the dmidecode contains several records from the DMI (Desktop Management interface) table.
Following is the record format of the dmidecode output of the DMI table.
Record Header: Handle {record id}, DMI type {dmi type id}, {record size} bytes
Record Value: {multi line record value}
- record id: Unique identifier for every record in the DMI table.
- dmi type id: Type of the record. i.e BIOS, Memory etc.,
- record size: Size of the record in the DMI table.
- multi line record values: Multi line record value for that specific DMI type.
Sample output of dmidecode command:
# dmidecode | head -15
# dmidecode 2.9
SMBIOS 2.3 present.
56 structures occupying 1977 bytes.
Table at 0x000FB320.
Handle 0xDA00, DMI type 218, 11 bytes
OEM-specific Type
Header and Data:
DA 0B 00 DA B0 00 17 03 08 28 00
Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
Vendor: Dell Computer Corporation
Version: A07
Release Date: 01/13/2004
Get the total number of records in the DMI table as shown below:
# dmidecode | grep ^Handle | wc -l 56 (or) # dmidecode | grep structures 56 structures occupying 1977 bytes.
2. DMI Types
DMI Type id will give information about a particular hardware component of your system. Following command with type id 4 will get the information about CPU of the system.
# dmidecode -t 4
# dmidecode 2.9
SMBIOS 2.3 present.
Handle 0x0400, DMI type 4, 35 bytes
Processor Information
Socket Designation: Processor 1
Type: Central Processor
Family: Xeon
Manufacturer: Intel
ID: 29 0F 00 00 FF FB EB BF
Signature: Type 0, Family 15, Model 2, Stepping 9
Flags:
FPU (Floating-point unit on-chip)
VME (Virtual mode extension)
DE (Debugging extension)
PSE (Page size extension)
TSC (Time stamp counter)
MSR (Model specific registers)
Following are the different DMI types available.
Type Information
----------------------------------------
0 BIOS
1 System
2 Base Board
3 Chassis
4 Processor
5 Memory Controller
6 Memory Module
7 Cache
8 Port Connector
9 System Slots
10 On Board Devices
11 OEM Strings
12 System Configuration Options
13 BIOS Language
14 Group Associations
15 System Event Log
16 Physical Memory Array
17 Memory Device
18 32-bit Memory Error
19 Memory Array Mapped Address
20 Memory Device Mapped Address
21 Built-in Pointing Device
22 Portable Battery
23 System Reset
24 Hardware Security
25 System Power Controls
26 Voltage Probe
27 Cooling Device
28 Temperature Probe
29 Electrical Current Probe
30 Out-of-band Remote Access
31 Boot Integrity Services
32 System Boot
33 64-bit Memory Error
34 Management Device
35 Management Device Component
36 Management Device Threshold Data
37 Memory Channel
38 IPMI Device
39 Power Supply
Instead of type_id, you can also pass the keyword to the -t option of the dmidecode command. Following are the available keywords.
bonnie++를 통한 시스템 벤치마킹(BMT Tool)
오픈소스 BMT 툴인 bonnie++입니다.
하드디스크 및 파일시스템의 성능 체킹을 하는 프로그램으로 상당히 유용할겁니다.
공식 사이트 : http://www.coker.com.au/bonnie++/
다운로드 :
http://www.coker.com.au/bonnie++/bonnie++-1.03a.tgz
http://www.rootman.co.kr/NFS2/Util/bonnie++-1.03.tgz
-------------------------------------------------------------------------------
1. 설치
-------------------------------------------------------------------------------
(1) 우선 다운로드 받은 후
wget http://www.coker.com.au/bonnie++/bonnie++-1.03a.tgz
(2) 설치
[root@ns1 ~]# cd /usr/local/src/bonnie++-1.03/; ./configure && make && make install
[root@ns1 /usr/local/src/bonnie++-1.03]# cp bon_csv2html.in /usr/sbin
-------------------------------------------------------------------------------
2. bonnie++ 옵션설명
-------------------------------------------------------------------------------
[root@ns1 ~]# bonnie++
You must use the "-u" switch when running as root.
usage: bonnie++ [-d scratch-dir] [-s size(Mb)[:chunk-size(b)]]
[-n number-to-stat[:max-size[:min-size][:num-directories]]]
[-m machine-name]
[-r ram-size-in-Mb]
[-x number-of-tests] [-u uid-to-use:gid-to-use] [-g gid-to-use]
[-q] [-f] [-b] [-p processes | -y]
(1) [-d scratch-dir ]
테스트에 사용될 Directory 지정
(2) [-s size(Mb)[:chunk-size(b)]]
IO 퍼포먼스 처리를 위한 메가 바이트 단위의 파일크기.
만일 크기가 1G 보다 크다면 데이터는 1G단위의 여러개의 파일로 저장이되며,
각 파일들은 1G크기 안에서 처리된다.
chunk-size는 Byte단위 크기를 측정하며, 256에 1048576사이여야 한다.
(3) [-n number-to-stat[:max-size[:min-size][:num-directories]]]
파일 생성 시험을 위한 파일의 수이며, 기본 *1024개의 파일이 생성되므로
-n 100이라 지정 시, 100*1024=102400개의 파일이 생성된다.
(4) [-m machine-name]
장비의 이름 - 보여주기 위한 목적
(5) [-r ram-size-in-Mb]
메모리 사이즈
(6) [-x number-of-tests]
테스트 실행 회수인데, 여러 번 테스트 목적이면 그 때 유용하다.
(7) [-u uid-to-use:gid-to-use]
유저아이디 사용.
(8) [-g uid-to-use:gid-to-use]
그룹아이디 사용.
(9) [-q]
조용히 실행
(10) [-f]
빠른 실행 (character I/O 테스트를 하지 않는다)
(11) [-b]
buffering write를 안 함. 모든 기록후 fsync()
(13) [-p processes | -y]
실행 위한 세마포어 프로세스 수
---------------------------------------------------------
3. 실제 사용 예
---------------------------------------------------------
[root@ns1 ~]# bonnie++ -d /home -s 2048:1024 -n 100 -f -m `hostname` -r 1024 -u root:root > BenchResult.txt
Using uid:0, gid:0.
Writing intelligently...done
Rewriting...done
Reading intelligently...done
start 'em...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
[root@ns1 ~]#
:: 간략 설명 ::
작업 디렉터리는 /home을 사용하며
생성 사이즈는 2G이고, chunk-size는 1024(1k)를 사용한다.
(파일 사이즈는 메모리의 2배로 해 주길 권고하고 있다.)
-n은 100개의 파일 테스트이고, 기본 파일 개수가 1024이기 때문에. 100*1024의 파일 개수를 생성한다.
-f를 지정하여 character I/O test를 생략합니다.
-r 메모리는 1024M이며
-x 2번 테스트합니다. (현재 제거함)
-u 사용자는 루트 권한으로 실행하며
결과를 BenchResult.txt를 생성합니다.
bon_csv2html , bon_csv2txt 명령을 이용해서 결과물을 html이나 plain text로 변환할 수 있습니다.
---------------------------------------------------------
4. HTML 표로 변환하는 방법
---------------------------------------------------------
[root@ns1 ~]# tail -n 1 BenchResult.txt | bon_csv2html > BenchResult.html
---------------------------------------------------------
5. 파일시스템 테스트 (ext2, ext3, softraid, large4)
---------------------------------------------------------
(1) 장비 : Intel SR1400
(2) CPU : Intel(R) Xeon(TM) CPU 3.00GHz X 2EA, HyperThreding ON
(3) Memory : DDR2 ECC 512M * 2EA
(4) 대상
ext2(soft Raid Level 0)
ext3(soft Raid Level 0)
ext2(Intel 2100S Level 0)
ext3(Intel 2100S Level 0)
1. cd /usr/ports/databases/memcached; make ; make install
2. vi /etc/rc.conf, and add memcached_enable="YES"
3. /usr/local/etc/rc.d/memcached start
4. run "netstat -an" to check that a process is listening on TCP 11211
5. cd /usr/ports/databases/pecl-memcache ; make ; make install
6. /usr/local/bin/php -i | grep -i 'memcache'
7. Play with memcached in PHP scripts

Prev
Rss Feed