2. Machine
(Kernel)
CLIENT
(browser)
Ring Buffer
(rx_ring)
Kernel
Memory
Packet
Data
Softlrq
Net_rx_action
Poll_queue(per CPU)
NIC1
NIC Interrupt
Handler
alloc_skb()
Netif_rx_schedule()
Raised softirq
DEVICE DRIVER
Interrupt
Generator
DMA Engine
NIC Memory
NIC1
Higher layer
Check
Queue
net.core.netdev_max_backlog
3. Client
Client
SYN
SYN/ACK
SYN
SYN/ACK
LISTEN Socket
QUEUE
Text line
SYN QUEUE ACCPET QUEUE
APPLICATION
(ESTABLISHED
with PID)
APPLICATION
ACK
ACK
(S(YENSTRAEBCLIESVHIEEDD )
without PID)
ACCEPT Call
ACCEPT Call
LISTEN Socket
(ESTABLISHED
without PID)
(SYN_RECEVIED)
(ESTABLISHED
with PID)
System Wide
net.ip4.tcp_max_syn_backlog
Per Socket
net.core.somaxconn
Listen(sockfd,backlog)
/proc/$PID/net/tcp data.
/proc/$PID/net/tcp data.
Socket
Text line Text line
Socket
Kernel
Layer
Application
Layer
4.
5. *SYN Flodding attack(DDOS)
kernel: possible SYN flooding on port X. Sending cookies.
When it happen(condition)
1. sysctl_max_syn_backlog is full
(=max_qlen_log) ==> net.ipv4.tcp_max_syn_backlog
2. listen queue is full
(=Accept queue) ==> net.core.somaxconn (Hard Limit)
Application can specify it.(Soft Limit)
3.SYN cookies enabled.
net.ipv4.tcp_syncookies
Reference :
http://blog.dubbelboer.com/2012/04/09/syn-cookies.htm
l
https://access.redhat.com/solutions/30453
6. WAS Engineer가 봐야하는 것
(Kernel parameter)
* 전체메모리 공간(bytes) = awk '/MemTotal:/ { printf "%0.f",$2 * 1024}' /proc/meminfo
net.core.somaxconn :Socket 프로세스 당 접속 대기 queue
net.ipv4.tcp_max_syn_backlog : Kernel 전체의 접속 대기 queue
net.ipv4.tcp_syncookies : 1 enable 시 소켓으로 syn backlog queue 가 넘칠때 syncookies 를 보낸
다.
net.core.netdev_max_backlog : Interface 당 수신 queue
net.ipv4.tcp_mem : TCP 전체 버퍼 사이즈
net.core.rmem_default : 수신 소켓 버퍼로 지정가능한 최대 메모리 크기
net.core.wmem_default : 송신 소켓 버퍼로 지정가능한 최대 메모리 크기
net.core.optmem_max : 소켓 당 할당된 최대 버퍼 사이즈를 지정한다.
net.ipv4.tcp_rmem : 수신 소켓 버퍼의 크기
net.ipv4.tcp_wmem : 송신 소켓 버퍼의 크기
net.ipv4.tcp_tw_reuse : TCP TIME_WAIT Socket 재사용 여부. (권장 : 사용)
net.ipv4.tcp_retries2 : 살아있는 TCP 연결을 끊기 전에 확인하는 횟수를 정한다.
net.ipv4.tcp_syn_retries : 활성화된 TCP 접속이 재전송을 시도하게 하기 위한 최초 SYN시간의 값을 정한다.
net.ipv4.tcp_synack_retries : passive TCP 접속 시도가 재 접속을 하기 위한 SYNACKs의 값을 정한
다.
net.ipv4.tcp_max_orphans : bind 되지 않은 소켓의 최대 수 (DoS 공격 방어용)
net.ipv4.tcp_orphan_retries : TCP 연결을 끊기전에 확인하는 횟수
net.ipv4.tcp_fin_timeout : TCP/IP가 처리 완료된 연결을 해제하여 해당 자원을 재 사용할 수 있다.
net.ipv4.tcp_keepalive_time : TCP/IP가 대기 연결이 계속 원래 상태를 유지하는지 확인을 시도하는 빈도를 제어
net.ipv4.tcp_keepalive_intvl : 상대로부터 활성화 상태 지속 응답이 수신되지 않을 경우
TCP/IP에서 활성화 상태 지속 전송을 반복하는 빈도를 결정.
net.ipv4.tcp_fin_timeout : FIN_TIMEOUT 대기 시간을 줄이면 끊어진 소켓의 소거 시간을 줄일 수 있음.
net.ipv4.icmp_echo_ignore_all : ICMP 차단
7. WAS Engineer가 봐야하는 것
(Ulimit parameter)
fs.aio-max-nr : 최대 AIO (asynchronous io) request의 수 (파일 수와는 무관)
fs.file-max : 시스템 전체에서 최대로 열 수 있는 파일개수
fs.nr_open : 하나의 프로세스가 핸들링하는 최대 파일개수
# ulimit -n : 일반 계정(root 제외)의 프로세스(세션)별 최대 오픈할 수 있는 파일 수
최대값 : fs.nr_open ( fs.nr_open보다 작거나 같아야 함)
# ulimit -u : nproc 값은 각 유저별로 생성할 수 있는 최대 프로세스의 갯수
* 각 파라메터의 연관관계
fs.file-max >= fs.nr_open >= ulimit -n
8. WAS Engineer가 봐야하는 것
명령어
(Commands)
* 프로세스 파일 오픈 수 확인
실행중인 모든 프로세스에서 사용하고 있는 파일의 수를 확인
# lsof | wc -l
PID 25102 프로세스의 파일 수 확인
# lsof -p 25102 | wc -l
해당 프로세스가 실제 사용하고 있는 파일 핸들러의 수
# ls /proc/25102/fd | wc -l
*현재 열려있는 프로세스의 수 확인
ps -eLf |grep PID |wc -l
pstree