tcpdump 와 같은 패킷 덤프 프로그램을 사용하면 몇 건의 패킷덤프가 되었는지 확인할 수 있다. 그런데, 캡쳐된 상태를 관심있게 살펴 보았다면, 의외로 drop 된 패킷 건수가 크게 나타나는 경우를 경험해 보았을지도 모른다.
다음의 경우를 보자:
16 packets captured
351742 packets received by filter
351655 packets dropped by kernel
tcpdump 를 이용해 패킷 덤프를 하다 Ctrl+C 를 통해 중지 하였는데, 16개의 패킷이 캡쳐되었다. 그런데 packets dropped by kernel 을 보면 그 카운터가 꽤 높다. 필터에서 받은 패킷 건수가 351,742 건인데 drop된 건수가 351,655 라는 것이다. 이러한 것은 다양한 원인이 있겠지만, 사용하는 패킷덤프 프로그램에 의한 영향이거나, 네트워크적인 영향, 하드웨어, 패킷필터, 운영체제와 관련한 것등이 있을 것이다.
이런 경우 IP 주소등을 이름으로 변경하는 작업등이 이뤄지지 않도록 하는 것 만으로도 큰 효과를 볼 수 있다.
tcpdump 에서는 '-n' 옵션을 사용하면 된다.
# tcpdump -i eth0 -n
51119 packets captured
51612 packets received by filter
493 packets dropped by kernel
같은 조건의 환경인데, -n 만을 사용하는 것만으로도 큰 차이가 나타난다. 패킷덤프시에는 이점을 참고하기 바란다. 이외, 커널 상에서 네트워크 관련 파라미터를 수정하는 것도 도움이 될 것이다. 패킷 덤프만이 아니라, 네트워크 관련된 서비스를 하는 시스템이라면 한번쯤은 검토해 보아야 한다.
sysctl 을 통해 관련 파라미터 정보를 확인할 수 있는데, 예를 들어 backlog 를 확인해 보면 아래와 같다.
# sysctl -a | grep backlog
error: permission denied on key 'net.ipv4.route.flush'
net.ipv4.tcp_max_syn_backlog = 1024
net.core.netdev_max_backlog = 5000
backlog 는 새로운 연결을 맺는데 관련하여 영향을 주는 파라미터중 하나다. 이외 여러가지 값 들이 있는데, 네트워크 연결이 많다면 다음과 같은 설정이 권장된다.
net.core.wmem_max = 8388608
net.core.rmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65536 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_default_win_scale = 7
net.ipv4.tcp_moderate_rcvbuf = 1
# sysctl -w net.core.rmem_max=8388608
와 같다. 참고로 리눅스 2.6.17 이후에는 오토튜닝이라는 기능이 있는데, 이것은 각 연결에 따라 버퍼 사이즈등이 동적으로 업데이트 되는 것이다. 이 값은 /proc/sys/net/ipv4/tcp_moderate_rcvbuf 를 통해 확인해 볼 수 있는데,
# cat /proc/sys/net/ipv4/tcp_moderate_rcvbuf
1 의 값이 셋팅되어 있다면 autotuning 이 설정되어 있는 것이다. 이런, 네트워크 관련 파라미터 설정외에도
현재 네트워크 관련한 상태를 확인해 보는 것도 원인 파악에 도움이 된다. 네트워크 상태를 파악하는데 기본적으로 많이 사용되는 netstat 를 사용하는 것만으로도 많은 정보를 얻을 수 있다.
# netstat -s
Ip:
2987551774 total packets received
480 with invalid headers
4288 with invalid addresses
139108843 forwarded
0 incoming packets discarded
2804683209 incoming packets delivered
1904276683 requests sent out
1832 outgoing packets dropped
1344 dropped because of missing route
169 fragments dropped after timeout
1551222 reassemblies required
38285 packets reassembled ok
230 packet reassembles failed
31867 fragments received ok
5222 fragments failed
1377531 fragments created
Icmp:
331800 ICMP messages received
26 input ICMP message failed.
ICMP input histogram:
destination unreachable: 331772
echo requests: 4
echo replies: 24
345417 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 340488
time exceeded: 451
redirect: 1831
echo request: 2647
IcmpMsg:
InType0: 24
InType3: 331772
InType8: 4
OutType3: 340488
OutType5: 1831
OutType8: 2647
OutType11: 451
Tcp:
7723898 active connections openings
13569062 passive connection openings
1469362 failed connection attempts
2505823 connection resets received
64 connections established
2794594182 segments received
1750284379 segments send out
4751200 segments retransmited
0 bad segments received.
1074943 resets sent
Udp:
9438290 packets received
323420 packets to unknown port received.
0 packet receive errors
9784976 packets sent
UdpLite:
TcpExt:
879602 resets received for embryonic SYN_RECV sockets
552 packets pruned from receive queue because of socket buffer overrun
21 ICMP packets dropped because they were out-of-window
...(생략)
그리고 다음 도표는 IBM 에서 정리된 파라미터 정보인데, 각 파라미터를 이해하는데 도움이 될거 같아 첨부하였다.
Tunable parameter | Default value | Option description |
---|---|---|
/proc/sys/net/core/rmem_default | "110592" | Defines the default receive window size; for a large BDP, the size should be larger. |
/proc/sys/net/core/rmem_max | "110592" | Defines the maximum receive window size; for a large BDP, the size should be larger. |
/proc/sys/net/core/wmem_default | "110592" | Defines the default send window size; for a large BDP, the size should be larger. |
/proc/sys/net/core/wmem_max | "110592" | Defines the maximum send window size; for a large BDP, the size should be larger. |
/proc/sys/net/ipv4/tcp_window_scaling | "1" | Enables window scaling as defined by RFC 1323; must be enabled to support windows larger than 64KB. |
/proc/sys/net/ipv4/tcp_sack | "1" | Enables selective acknowledgment, which improves performance by selectively acknowledging packets received out of order (causing the sender to retransmit only the missing segments); should be enabled (for wide area network communication), but it can increase CPU utilization. |
/proc/sys/net/ipv4/tcp_fack | "1" | Enables Forward Acknowledgment, which operates with Selective Acknowledgment (SACK) to reduce congestion; should be enabled. |
/proc/sys/net/ipv4/tcp_timestamps | "1" | Enables calculation of RTT in a more accurate way (see RFC 1323) than the retransmission timeout; should be enabled for performance. |
/proc/sys/net/ipv4/tcp_mem | "24576 32768 49152" | Determines how the TCP stack should behave for memory usage; each count is in memory pages (typically 4KB). The first value is the low threshold for memory usage. The second value is the threshold for a memory pressure mode to begin to apply pressure to buffer usage. The third value is the maximum threshold. At this level, packets can be dropped to reduce memory usage. Increase the count for large BDP (but remember, it's memory pages, not bytes). |
/proc/sys/net/ipv4/tcp_wmem | "4096 16384 131072" | Defines per-socket memory usage for auto-tuning. The first value is the minimum number of bytes allocated for the socket's send buffer. The second value is the default (overridden by wmem_default ) to which the buffer can grow under non-heavy system loads. The third value is the maximum send buffer space (overridden by wmem_max ). |
/proc/sys/net/ipv4/tcp_rmem | "4096 87380 174760" | Same as tcp_wmem except that it refers to receive buffers for auto-tuning. |
/proc/sys/net/ipv4/tcp_low_latency | "0" | Allows the TCP/IP stack to give deference to low latency over higher throughput; should be disabled. |
/proc/sys/net/ipv4/tcp_westwood | "0" | Enables a sender-side congestion control algorithm that maintains estimates of throughput and tries to optimize the overall utilization of bandwidth; should be enabled for WAN communication. This option is also useful for wireless interfaces, as packet loss may not be caused by congestion. |
/proc/sys/net/ipv4/tcp_bic | "1" | Enables Binary Increase Congestion for fast long-distance networks; permits better utilization of links operating at gigabit speeds; should be enabled for WAN communication. |
댓글 없음:
댓글 쓰기