2015년 6월 10일 수요일

Linux Performance and Tuning Guidelines 초간단 요약


- 병목점 찾기
1 시스템 파악
2 시스템 백업
3 시스템의 성능 모니터링하고 분석
4 문제가 있는 병목점을 정한 후 원인 찾기
5 한번에 하나씩 시도하며 병목점 문제 해결
6 시스템의 성능이 만족스러울 때까지 3으로 돌아가 반복

- CPU performance tuning
ps -ef로 확인하여 불필요한 프로그램이 돌고 있으면 cron을 써서 중요하지 않은 시간에 돌도록 변경
CPU를 많이 쓰나 중요하지 않은 프로세스는 priority를 조정(top, renice)
SMP 머신의 경우 프로세스가 여러 프로세서에서 돌지 않도록 해준다(taskset)
실행중인 애플리케이션에 따라 CPU를 증설하는 것보다는 더 빠른 CPU로 바꾸어 주는 것이 나을 수 있다.
최신 driver나 firmware를 사용한다.

- Memory performance tuning
bigpages, hugetlb, shared memory를 사용해서 swap space를 튜닝
page의 사이즈를 늘리거나 줄이기
active와 inactive memory를 다루는 방법을 향상시키기
page-out rate를 조절하기
서버에서 각각의 유저가 사용가능한 리소스 제한하기
불필요한 서비스 중단하기
메모리 늘리기

- Disk performance tuning
workload가 sequential 때문이라면 더 빠른 disk controller를 설치한다. workload가 random 때문이라면 drive를 추가한다.
RADI환경에서는 disk drive를 추가한다. 하드웨어 RAID를 사용한다.
striping없는 logical volume을 사용하는 것보다 striping있는 logical volume을 사용하는 것을 고려해라.
네트워크상의 다른 시스템으로 프로세싱 넘기기 - Offload processing to another system in the network (users, applications, or services).
더 많은 램을 추가하기

- Network performance tuning
네트워크 카드의 설정이 router와 switch 설정과 잘 맞는지 확인(frame size)
subnet 조작하기
더 빠른 네트워크 카드 사용하기
적절한 IPv4 TCP 커널 파라메터 튜닝하기
네트워크 카드 바꾸고 성능 측정하기
네트워크 카드를 추가하고 바인딩하기

- Changing kernel parameters
kernel parameter에 대한 정보는 /proc(or /proc/sys)에 저장된다.
sysctl 사용
  예: > sysctl /proc/sys/kernel/kernel.shmmax
  reboot후 설정 사라짐. /etc/sysctl.conf에 위 내용 넣어두면 계속 적용

- Tuning the processor subsystem
프로세스의 priority를 변경 - renice
CPU affinity
  프로세스를 특정 CPU에서만 돌도록 하기
    irq 19를 3번째 CPU에 할당
    > echo 03 > /proc/irq/19/smp_affinity
  SMT(symmetric multi-threading)시스템에서는 물리 CPU가 인터럽트를 처리하도록 하기
NUMA(Non-Uniform Memory Architecture) 시스템
  NUMA지원이 없는 애플리케이션이 병목점이 될 수 있다. numastat(numactl 패키지)로 확인

- Tuning the vm subsystem
swap 설정
  메모리 페이지 스왑하기 - /proc/sys/vm/swappiness(값을 크게하면 swap이 더 잘 일어나게 된다.)
  pdflush daemon이 얼마나 자주 flush를 하는지 설정 - /proc/sys/vm/dirty_background_ratio(값을 크게하면 flush가 더 잘 일어나게 된다.)
  애플리케이션에 의해 만들어진 dirty page를 디스크로 flush하는 비율 설정 - /proc/sys/vm/dirt_ratio(file system cache의 비율 설정)
Swap partition
  보통의 스왑 파티션은 물리 메모리의 두배
  스왑 파티션을 여러개 만드는 것이 성능을 향상시킬 수 있다.
    순차적 사용, 여러개 동시에 사용
  스왑 파티션은 가장 빠른 드라이브에 설정한다.
HugeTLBfs
  TLB(Translation Lookaside Buffer)의 크기를 늘린다. - /proc/sys/vm/nr_hugepages
    TLB - a small cache used for storing virtual-to-physical mapping information
  /proc/meminfo로 hugetlb page의 정보를 볼 수 있다.

- Tuning the disk subsystem
Hardware 고려사항
  disk I/O가 중요한 시스템: file, print, database server
  disk I/O가 중요하지 않은 시스템: email, web server
  RAID로 엮은(software and hardware RAID) drive를 통해 성능을 향상 시킬 수 있다.
  파티션 나누기
    보안을 향상시킨다.
    data integrity를 향상시킨다.
    새로운 인스톨이나 업그레이드 시 다른 파티션에 영향을 주지 않을 수 있다.
    효율적인 백업 가능
I/O elevator
  elevator 선택하기
    Synchronous file system access
      anticipatory elevator - least throughput and the highest latency
      CFQ, NOOP, deadline은 비슷하게 좋으나 I/O 사이즈가 16kb가 넘어가면 CFQ와 NOOP가 좋음
    Complex disk subsystems
      NOOP elevator
    Database systems
      seek-oriented 특성때문에 deadline elevator가 좋다.
    Virtual machines
      virtualization layer가 필요한 작업을 한다.
    CPU bound applications
      NOOP elevator
    Simple ATA or SATA disk subsystems
      anticipatory elevator
  nr_requests
    > echo 64 > /sys/block/sdb/queue/nr_requests
    disk subsystem과 I/O 특성에 따라 다르게 해줄 필요가 있다.
      nr_requests의 값 별로 I/O 사이즈에 따른 throughput 측정
  read_ahead_kb
    > echo 64 > /sys/block/<disk_subsystem>/queue/read_ahead_kb
    large streaming read의 경우 read ahead buffer의 크기를 증가시키면 성능 향상이 올 수 있다.
    random I/O operation의 경우는 별로 효과가 없을 것이다.
  file system 선택하기
    적은 I/O request의 경우 ReiserFS가 적합하고 매우 큰 파일 시스템과 매우 큰 I/O 사이즈에서는 XFS와 JFS가 좋다. Ext3는 좋은 multiprocessor scalability를 제공하면서 적은 I/O request에 적합하기 때문에 이들의 중간점이라 볼 수 있다.
    JFS, XFS: high-end data warehouses, scientific workloads, large SMP servers, or streaming media servers
    ReiserFS, Ext3: file, web, mail
    Ext2는 synchronous file system acccess시 좋음. data integrity보다 성능이 우선시 되는 경우 선택한다. asynchronous file system의 경우는 ReiserFS가 Ext3보다 좋다.
    I/O priority
      CFQ I/O elevator에서 제공하는 process에 priority를 할당하는 기능
      ionice를 사용
        idle, best-effort, real time
    Access time updates
      linux file system이 저장하는 파일의 시간정보를 저장하지 않음으로서 성능향상을 줄 수 있다.
    Journaling mode 선택하기
      mode 변경방법
        > mount -o data=writeback /dev/sdb1 /mnt/mountpoint
        또는 /etc/fstab에서 변경가능
          /dev/sdb1 /testfs ext3 defaults,data=writeback 0 0
      data=journal
        file data와 metadata를 저널링한다.
      data=ordered(default)
        metadata만 저널링한다.
      data=writeback
        특별히 적은 I/O사이즈의 경우 Ext3의 성능을 향상시킨다.
        I/O 사이즈가 증가하면 writeback의 효과는 줄어든다.
        write의 경우 성능향상이 있고 read의 경우 별 효과가 없다.
    Block sizes
      작은 파일을 많이 다룬다면 작은 block size가 좋다.
      많은 파일을 많이 다룬다면 큰 block size가 좋다.
      하지만 여러 벤치마크를 보면 block size의 변경으로 실제 성능향상을 보기는 쉽지 않다. 그러므로 디폴트인 4K로 두는 것이 일반적으로 좋다.
      hardware RAID가 사용되는 경우 array의 stripe size가 성능에 매우 큰 영향을 미친다.
- Tuning the network subsystem
네트워크 트래픽
  netstat, tcpdump, ethereal을 사용하여 정보 획득
  고려사항:
    Transaction throughput requirements (peak, average)
    Data transfer throughput requirements (peak, average)
    Latency requirements
    Transfer data size
    Proportion of send and receive
    Frequency of connection establishment and close or number of concurrent connections
    Protocol (TCP, UDP, and application protocol such as HTTP, SMTP, LDAP, and so on)
speed and duplexing
  NIC의 속도 확인
  네트워크 컴포넌트(switch or hub)와 NIC의 관계 확인
MTU size
  Maximum Transmission Units
  > ifconfig eth0 mtu 9000 up
  모든 네트워크가 큰 MTU를 지원하지는 않는다.
Network buffer 증가시키기
  memory resources
    초기 TCP memory
      /proc/sys/net/ipv4/tcp_mem
    receive socket memory
      /proc/sys/net/core/rmem_default
      /proc/sys/net/core/rmem_max
    send socket memory
      /proc/sys/net/core/wmem_default
      /proc/sys/net/core/wmem_max
    option memory buffer
      /proc/sys/net/core/optmem_max
  window size 조정
    BDP(bandwidth delay product)로 최적의 window size 값을 알아올 수 있다.
      BDP = Bandwidth(bytes/sec) * Delay(or round trip time)(sec)
    tcpdump로 변경 내용 확인
TCP/IP tuning
  IP와 ICMP tuning
    spoofing attack 막기
      > sysctl -w net.ipv4.conf.eth0.accept_source_route=0
      > sysctl -w net.ipv4.conf.lo.accept_source_route=0
      > sysctl -w net.ipv4.conf.default.accept_source_route=0
      > sysctl -w net.ipv4.conf.all.accept_source_route=0
    지정된 머신이 아닌 곳에서의 redirect 막기
      > sysctl -w net.ipv4.conf.eth0.secure_redirects=1
      > sysctl -w net.ipv4.conf.lo.secure_redirects=1
      > sysctl -w net.ipv4.conf.default.secure_redirects=1
      > sysctl -w net.ipv4.conf.all.secure_redirects=1
    ICMP redirect 막기
      > sysctl -w net.ipv4.conf.eth0.accept_redirects=0
      > sysctl -w net.ipv4.conf.lo.accept_redirects=0
      > sysctl -w net.ipv4.conf.default.accept_redirects=0
      > sysctl -w net.ipv4.conf.all.accept_redirects=0
    router가 아닌 경우 redirect 보내지 않기
      > sysctl -w net.ipv4.conf.eth0.send_redirects=0
      > sysctl -w net.ipv4.conf.lo.send_redirects=0
      > sysctl -w net.ipv4.conf.default.send_redirects=0
      > sysctl -w net.ipv4.conf.all.send_redirects=0
    broadcast ping과 smurf 공격 무시하기
      > sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
    icmp 패킷이나 ping 무시하기
      > sysctl -w net.ipv4.cimp_echo_ignore_all=1
    router에 의한 invalid response 무시하기
      > sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
    IP fragment를 합치는데 사용되는 메모리 설정
      > sysctl -w net.ipv4.ipfrag_low_thresh=262144
      > sysctl -w net.ipv4.ipfrag_high_thresh=393216
  TCP tuning
    TIME_WAIT socket 다시 사용하기
      > sysctl -w net.ipv4.tcp_tw_reuse=1
      > sysctl -w net.ipv4.tcp_tw_recycle=1
    tcp_fin_timeout 값 줄이기
      FIN-WAIT-2에서 소켓을 가지고 있는 시간
      > sysctl -w net.ipv4.tcp_fin_timeout=30
    동작중이지 않은 소켓 연결 끊는 시간 줄이기
      > sysctl -w net.ipv4.tcp_keepalive_time=1800
    backlog connections queue값 올리기
      > sysctl -w net.ipv4.tcp_max_syn_backlog=4096
    TCP SYN cookies는 필요할 때만 키기
      > sysctl -w net.ipv4.tcp_syncookies=1
      커널이 CONFIG_SYNCOOKIES로 컴파일되어야 함
      Dos와 DDos를 막아주기는 하지만 성능에 영향을 미침
  TCP options tuning
    selective acknowledgment 막기
      > sysctl -w net.ipv4.tcp_sack=0
      > sysctl -w net.ipv4.tcp_dsack=0
    TCP timestamp 막기
      > sysctl -w net.ipv4.tcp_timestamps=0
      backend system의 경우 굳이 time stamp 필요없음
    window scaling 막기
      > sysctl -w net.ipv4.tcp_window_scaling=0
      high network load에서는 window scaling이 좋지 않음
Netfilter
  packet filtering capability와 network security를 향상시키지만 예측가능하지 않은 행동을 유발할 수 있다.
  영향을 끼치는 요인
    Number of rules
    Order of rules
    Complexity of rules
    Connection tracking level (depends on protocols)
    Netfilter kernel parameter configuration
Offload configuration
  ethtool 사용
    > ethtool -k eth0
packet queue의 크기 늘리기
  /proc/sys/net/core/netdev_max_backlog
transmit queue length 늘리기
  > ifconfig eth1 txqueuelen 2000
  large, homogeneous data transfer를 수행하는 high-speed 연결에 적합
인터럽트 줄이기
  network interface의 인터럽트를 물리 CPU에 할당하면 성능 향상을 얻을 수 있다.
  interrupt number 알아내기
    > ifconfig eth1
  인터럽트의 CPU affinity 설정하기
    > echo 02 > /proc/irq/169/smp_affinity

- sysctl tutorial

http://www.frozentux.net/ipsysctl-tutorial/ipsysctl-tutorial.html

- 참고

https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/index.html

댓글 없음:

댓글 쓰기

Building asynchronous views in SwiftUI 정리

Handling loading states within SwiftUI views self loading views View model 사용하기 Combine을 사용한 AnyPublisher Making SwiftUI views refreshable r...