2010년 11월 17일 수요일

커널에서 drop 되는 패킷 수가 많다면...

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 을 통하거나 /proc 파일 시스템을 직접 엑세스 할 수 있다.  sysctl 을 이용한다면,

# 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 parameterDefault valueOption 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.


댓글 없음:

댓글 쓰기