2016년 11월 7일 월요일

리눅스 ( Tuned 데몬을 이용한 OS 튜닝) 튜닝

tuned 패키지 대해 알아보겠습니다. 

  • Tuned 시스템 모듈로서 시스템 사용에 대한 데이터를 모니터링 하고, 수집하여 데이터를 기반으로 동적으로 시스템 설정을 조절하기 위한 데몬입니다보통 CPU 전력 소비 비활성화를 Disable 하거나, CPU/네트웍/디스크 등의 설정을 조정하기 위해 사용하며, Profile 패키지로 묶여있어, 리눅스 튜닝에 대해 잘모르는 분들이 쉽게 튜닝하도록 만들어진 모듈이라고 볼수 있습니다.

  • 설치
[root@blade01 ~]# rpm -qa |grep tuned
tuned-0.2.19-6.el6.noarch
tuned-utils-0.2.19-6.el6.noarch

Rpm 으로 설치하거나 Yum 통해 설치를 하면 됩니다
$> yum install tuned

  • Tuned-adm Profile 종류
    • 위에 설명과 같이 tuned-adm 통해 몇가지 패키지화된 Profile 제공하고 있으며 프로파일을 통해 가볍게 적용할 있습니다.

  • Tuned-adm list 확인 방법
[root@blade01 ~]# tuned-adm list
Available profiles:
- desktop-powersave
- latency-performance
- laptop-battery-powersave
- server-powersave
- spindown-disk
- default
- laptop-ac-powersave
- throughput-performance
- enterprise-storage
Current active profile: latency-performance

  • Tuned-adm 설명
    • 중요하게 사용되는 몇가지 알아 봅니다. 만약 DBMS 경우 Latency-performance 것을 권장합니다.
Default
기본적인 절전 프로파일. 디스크 CPU 플러그인만 활성화함.
latency-performance
지연성능 튜닝용. 절전 매커니즘을 비활성화하고, CPU Polling C0 활성화함
CPU 절전에 들어가지 않는다고 보면됨. I/O 스케줄러는 모두 Deadline 으로 변경되고,
전원관리의 cpu_dma_latency 0으로 등록됨
( 여기서 cpu C-0 활성화하는 옵션이 cpu_dma_latency 입니다. )
이값이 200이상으로 설정하면 C-6
20~199 경우 C-3
1~19 경우 C-1
0 경우 C-0 활성화 됩니다.
throughput-performance
처리량 성능튜닝용 . 절전 매커니즘을 비활성화시스템에 엔터프라이즈급 스토리지가 없는 경우 권장
Latency-performance 동일하나 아래와 같은 차이점이 있다.
kernel.sched_min_granularity_ns = 4000000  -> 10000
kernel.sched_wakeup_granularity_ns = 4000000 -> 15000
vm.dirty_ratio = 20 -> 40 
THP 활성화
enterprise-storage
엔터프라이즈급 스토리지가 있는 경우( 백업 컨트롤러 캐쉬, 디스크 내장 캐시가 있는) 서버에 권장
Throughput-performance 동일하지만 파일 시스템이 barrier=0 으로 Mount .  

여기서 파일시스템 mount 옵션을 barrier 바꾸는 것은 간단히 설명하면 파일시스템의 무결성과
일관성을 위한 옵션으로 볼수 있다.  Ext4, XFS 파일 시스템은 기본적으로 활성화 되어 있고,
데이터가 저장장치에 기록이 되면 디스크캐시에 존재하는 데이터를 물리적 저장장치에 기록을 보장하는 것이다만약 배터리가 있는  RAID 컨트롤러 캐시를 사용한다면 시스템 전력이 나가더라도, RAID 컨트롤러에서  fsync() 해주므로, 불필요한 Fsync() 작업을 barrier=0 통해 Disable 있다.


  • Tuned 데몬 start
    • [root@blade01 ~]# service tuned start

  • Tuned Latency 모드로 활성화 방법
    • [root@blade01 ~]# tuned-adm profile latency-performance


  • CPU 활성화 모니터링 (powertop 통해 모니터링 가능)
    • [root@blade01 ~]#powertop

  • Tuned-adm Profile 쓰지 않고 CPU 전력 활성화와 CPU C-State 올리는 방법
    • Cpu_dma_latency 값만 조절하면 된다.
    • 다만 Tuned 에서 사용하는 파이썬 파일을 활용하는 것이 편리하므로 , Tuned Yum 으로 설치하고 아래와 같이 cpu_dma_latency 값만 수정한다.
      • Cpu_dma_latency 값에 따른 CPU C-State 활성화
# /usr/libexec/tuned/pmqos-static.py cpu_dma_latency=0
pk cr CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6
100.00 2.93 2.67 0.00 0.00 0.00 0.00 0.00

/usr/libexec/tuned/pmqos-static.py cpu_dma_latency=200
pk cr CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6
0.04 2.19 2.67 0.04 0.26 99.66 0.91 91.91
Set it to anything in between 20 and 199, and you get into C3:

# /usr/libexec/tuned/pmqos-static.py cpu_dma_latency=199
pk cr CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6
0.03 2.28 2.67 0.03 99.94 0.00 89.65 0.00
Set it to anything in between 1 and 19, and you get into C1:

# /usr/libexec/tuned/pmqos-static.py cpu_dma_latency=19
pk cr CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6
0.02 2.18 2.67 99.98 0.00 0.00 0.00 0.00
Set it to 0 and you get into C0. This is what latency-performance
profile does.

# /usr/libexec/tuned/pmqos-static.py cpu_dma_latency=0
pk cr CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6
100.00 2.93 2.67 0.00 0.00 0.00 0.00 0.00


2016년 11월 4일 금요일

리눅스 (DBMS 장비 OS 튜닝 ) 튜닝



  • 리눅스 OS 커널파라미터 튜닝 

오늘은 제가 자주 사용하는 리눅스 튜닝 값에 대한 정리를 해볼까 합니다. 
제가 DBA 다 보니, 해당 튜닝값은 DBMS 에 특화되었다고 보시면 되고, 보통 Mysql 이나 Nosql 기반으로 참조하시면 됩니다. 
Oracle 은 자료가 많으니 , Oracle 권장값을 확인하시면 되구요. 
Oracle 은 shard Memory 영역도 튜닝해야 되니까요. 


아래에서 참고로 Sysctl 로 커널파라미터를 변경한 것은 Dynamical 한 값입니다.  Mysql 에서 Set variables 로만 변경한 것이랑 똑같은 효과이고, 서버 리부팅시에도 튜닝한 값이 적용할 수 있도록 영구화 작업을 해주어야 합니다. 

  • 커널 파라미터 영구화 방법 
    1. sysctl 로 변경 -> /etc/sysctl.conf 에 추가 
    2. echo never 로 변경 ->  /etc/rc.local 에 추가 하고 chmod +x /etc/rc.local 
  • 공통 적용 항목 
    • 아래 항목은 DBMS 의 상태를 보며 튜닝하는 값이 아닌 제가 Default 로 무조건 변경하는 값입니다.  일단 해당 값으로 적용한 후에, 조금씩 변경을 하기도 합니다.  
## 메모리 관련 변경 

##  리눅스에서 Free Memory 가 있는데도 Swap 을 사용하는 빈도를 줄이기 위한 세팅 입니다. 0 또는 1의 값으로 보통 변경합니다. ( Default 60 입니다. )  해당 파라미터의 더욱 자세한 내용은 저의 블로그 Swappiness 부분을 참조 하시면 됩니다. (http://justinsona.blogspot.kr/search/label/Swap)

sysctl -w vm.swappiness=0
  
## Free 메모리가 많이 부족하여 캐쉬에서 자주 땡겨오는게 보일때 아래값설정이 도움이 될 것입니다. min_free_kbytes 는 최소한 해당 크기만큼은 Free 메모리를 확보해 놓겠다라는 값입니다.  

sysctl -w vm.vfs_cache_pressure=10000
sysctl -w vm.min_free_kbytes=131072


## 디스크 스케줄러 변경 


## 로컬 디스크를 쓸때 deadline 이 성능개선에 큰 도움이 됩니다. SSD 또는 Fusion-IO 의 경우  Noop 가 좋아요. 자체 스케줄러를 사용하기 때문에 OS 의 스케줄러는 아무겂도 안하는게 좋다는 개념인거지요 
I/O 안밀리는 장비라도 DBMS 장비에서는 Deadline 으로 변경하시는게 10% 정도 디스크 Busy 율을 떨어 뜨릴 수 있습니다.  

echo deadline > /sys/block/sdb/queue/scheduler
echo deadline > /sys/block/sdc/queue/scheduler


## Disk 스케줄러 상세 설명

I/O
Elevator 종류는?
1. noop 스케줄러
- No Operation. 아무것도 하지 않는 스케줄러.
- 주로 지능형RAID 컨트롤러있거나, SSD사용하거나, 반도체 디스크 등 성능 좋은 디스크를 사용할 경우 선택되어지는 스케줄러로 커널은 아무것도 하지 않는
것이 부하를 줄일 수 있다는 생각이 기저에 있다.
2.anticipatory(as) 스케줄러
- 발생되는 I/O요청에서 향후 발생되는 I/O 요청의 위치를 예측하고 위치 떨어진 I/O 요청 처리를 중지하고 위치 가까운 I/O 요청을 처리하는 방식이다.
- 지연 시간을 줄이고 처리량을 향상하는 것.
- 전통적인 하드 디스크와 비슷한 구조이다.
- 입출력을 기다려 모아서 처리하는 성질이 있어 지연 시간은 나쁘게 될 가능성도 있다.
3. deadline스케줄러
- I/O 대기 시간의한계점(deadline)을 마련하고, 그것이 가까워 온 것부터 먼저 처리한다.
- 처리량보다 지연에최적화된 스케줄링을 한다.
- 읽기 및 쓰기를 모두 균형있게 처리한다.
- 몇몇 프로세스가 많은 수의 I/O를 발생시키는 환경에 적합하다.
- 데이터 베이스의파일 시스템에 많이 사용된다.
4.cfq(Completely Fair Queuing) 스케줄러
- 프로세스마다 I/O대기열을 가지고 최대한 균등하게 예약을 한다.
-많은 프로세스들이 세세한 I/O를 많이 발생시킬 때 사용하면 좋다.
- FedoraCore 커널 패키지의 기본이다.


## 네트웍 튜닝 프로퍼티

# 소켓 버퍼 늘려주는 파라미터 입니다.
##기본값)
#sysctl -w net.core.rmem_max=229376
#sysctl -w net.core.wmem_max=229376
#sysctl -w net.ipv4.tcp_wmem="4096 16384 4194304"
#sysctl -w net.ipv4.tcp_rmem="4096 16384 4194304"

## 튜닝값 
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_wmem="4096 12582912 16777216"
sysctl -w net.ipv4.tcp_rmem="4096 12582912 16777216"


## THP Disable 
## 리눅스가 자체적으로 Huge Memory page 할당을 방지것입니다.  
DB 는 큰 메모리 페이지를 한번에 할당하는 방식을 사용하면 성능 저하 가능성 및 Hang 과 같은 현상 발생하기 쉽기 때문에 THP 를 비활성화 합니다.  
특히 메모리 캐쉬방식의 NoSQL 은 사용하지 않는 것이 일관적인 성능 Latency 에 도움이 됩니다. 

echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag"




  • 개별 적용 항목 

      • 개별적용 항목은 개별적으로 상태를 보면서 변경하는 값입니다.   


    ## File System , Storage I/O 튜닝 프로퍼티

    ## 아래는 I/O 를 요청한 CPU 가 완료 요청까지 받을 것이냐 , 다른 CPU 도 완료요청을 받아 처리할것이냐라는 affinity 를 수정하는 겁니다. ## I/O 처리량이 많아 밀릴때 2로 변경하는 것도 도움이 됩니다.
    echo 2 > /sys/block/sdb/queue/rq_affinity
    echo 2 > /sys/block/sdc/queue/rq_affinity 

    ## 아래는 요청된 파일 주변의 다른 페이지들까지 미리 읽어 읽기 부하를 감소시키는 튜닝값등입니다.  시스템마다 틀리니 적절하게 변경하는 것이 도움이 됩니다.  
    echo 512 > /sys/block/sdb/queue/nr_requests
    echo 512 > /sys/block/sdc/queue/nr_requests
    echo 256 > /sys/block/sdb/queue/read_ahead_kb
    echo 256 > /sys/block/sdc/queue/read_ahead_kb

    ## OS 버퍼 캐쉬 튜닝
    ## 아래 값들은.... 해당 장비에 Read 가 많냐? Write 가 많냐에 따라 틀려질수 있어서.. 적절히 튜닝이 필요합니다. 왠만하면 변경하지 않고 Default 로 쓰는 걸로..
    예를 들어 만약 OS 파일 캐쉬에서 디스크로 파일을 쓸때 I/O 요청량이 많아 시스템이 튈 경우 아래 파라미터를 조절하여 자주자주 쓰게 변경 할 수 있습니다.  쓰기 비율, 얼마나 자주쓸것인지 등 디스크 I/O 와 OS 캐쉬와 관련된 파라미터라 보면 됩니다.  

    sysctl -w vm.dirty_ratio=80
    sysctl -w vm.dirty_backgroud_ratio=5
    vm.dirty_expire_centisecs = 12000 ## from 3000

    ## 마운트 튜닝
    ## 아래 옵션은 SSD 일 경우 Mount 옵션을 변경하는 것입니다.  HDD 일경우 그냥 Default 로 사용하면 되고, SSD 일경우 discard 와 nobarrier 옵션을 추가 하면 됩니다.   
    mount -o defaults,noatime,discard,nobarrier

    2016년 10월 13일 목요일

    Nagios 모니터링 연동방안

    Nagios 모니터링 연동방안

    최근 게임을 OPEN 준비하면서 Mysql 의 확장성을 고려하여 서버를 많이 분할 하게 되었다. 하나의 게임이 게임서버와 DB 서버가 많다보니, 이를 한눈에 장애를 파악하고자 모니터링 툴이 필요하였다.  일반적으로 Zabbix 로 모니터링을 하고 있으나, 추가적인 모니터링 강화를 위해 Nagios 를 연동해 보았고, 이에 대한 연동 방안을 공유 하고자 합니다.


    1. Nagios 란 ?
       Nagios 는 시스템 모니터링 프로그램으로, 기본적으로 호스트, PING, 서비스, 네트워크를 모니터링 하고 있으며, 추가적인 스크립트나 프로그램들을 구글상에서 쉽게 구할 수 있다. (사용자가 쉽게 쉘로 작성해도 된다 .)
       이 수집된 정보를 CSS,PHP 등을 통해 웹으로 뿌려주기 때문에, 편리한 툴인듯 보인다.

    nagios core - 로컬 호스트를 모니터링 할 수 있다 cpu사용량 메모리 사용량 등 다양하게 많다
    nagios plugin - 모니터링할 수 있는 다양한 옵션들. 이 플러그인을 사용해서 원하는 모니터링을 설정할 수 있다. ssh를 통해 원격지의 정보를 주고받는다
    nrpe - 원격 서버를 모니터링 할 수 있다. 두개의 서버 모두 nagios가 설치되어 있어야 하고, 모니터링 할 서버의 nrpe.cfg를 보고 그 항목을 감시할 수 있다

    2. Nagios 설치 

     일단 서버로 볼수 있는 Nagios Core 를 설치하자 
     a. dependency 설치 
        yum install -y httpd php gcc glibc glibc-common gd gd-devel make net-snmp

     b. 유저 생성/그룹생성 
        useradd nagios
        groupadd nagcmd
        usermod -G nagcmd nagios

     c. Nagios 다운로드 
        # wget http://sourceforge.net/projects/nagios/files/nagios-4.x/nagios-4.0.8/nagios-4.0.8.tar.gz/download
        # wget http://nagios-plugins.org/download/nagios-plugins-2.0.3.tar.gz

     d. Nagios 설치 
        # tar vzxf nagios-4.0.8.tar.gz
        # tar vzxf nagios-plugins-2.0.3.tar.gz

       # cd nagios-4.0.8
       # ./configure --with-command-group=nagcmd
       # make all
       # make install
       # make install-init  ## /etc/init.d/에 등록됨
       # make install-commandmode   ##nagios라는 유저가 없으면 여기서 에러남
       # make install-config  ## /usr/local/nagios에 설정파일 생성됨
       # make install-webconf  ## /etc/httpd/conf.d/nagios.conf 생성됨

      e. alert 을 받을 메일 주소 입력 
       # vi /usr/local/nagios/etc/objects/contacts.cfg

       define contact {
            contact_name          nagiosadmin         
            use                    generic-contact      ##template에 정의되어 있는 기본정보들
            alias                     Nagios Admin      ## 상세한 이름
            email                    dupont3031@naver.com  ## 여기다 email 주소 입력
            }

      f. 웹 인터페이스 접속시 사용할 패스워드 생성
        # htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

      g. nagios-plugin 컴파일
        # cd /src/nagios-plugins-2.0.3
        # ./configure --with-nagios-user=nagios --with-nagios-group=nagios
        # make && make install 

      h. 컨피그 파일 검사
        # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

      i. 서비스 기동 
         # service nagios start.


    3. Nagios Client 설치
      성능이 수집되야 할 서버에 Client 를 설치해서 Nagios 서버로 전송하는 방식을 사용하였다.  NRPE 를 사용하여 
      서버가 원격에 있는 스크립트를 수행하여 결과를 전송받는 형태로 Client 에서 발생할 수 있는 부하를 최소화 할 수 있다 .

    1. dependency 설치

    yum install -y gcc glibc glibc-common gd gd-devel make net-snmp openssl-devel --skip-broken

    2. 유저 생성 
    $> useradd nagios

    3. 폴더 생성 
    $> mkdir -p /home/dba_admin/justin 

    4. 패키지 다운로드 
    $> scp ~~ 

    5. 압축 해지
    $> gzip -cd nagios-plugins-2.1.3.tar.gz | tar -xvf -
    $> gzip -cd nrpe-2.13.tar.gz | tar -xvf -  

    6. plugin 설치 
    $> cd nagios-plugins-2.1.3
    $> ./configure 
    $> make && make install 



    7. 권한 부여
    $> chown nagios.nagios /usr/local/nagios
    Cd ..
    $> mv check_mem /usr/local/nagios/libexec/
    $> mv check_cpu /usr/local/nagios/libexec/
    $> mv check_iostat  /usr/local/nagios/libexec/

    $> chown -R nagios.nagios /usr/local/nagios/libexec

    8. xinetd 설치
    $> yum install xinetd -y


    9. nrpe 설치
    $> cd nrpe-2.13
    $> ./configure --enable-command-args
    $> make all && make install-plugin && make install-daemon && make install-daemon-config && make install-xinetd 
    $>  vi /usr/local/nagios/etc/nrpe.cfg
    dont_blame_nrpe=1
    allowed_hosts=127.0.0.1, 192.118.222.44

    10. xinetd 에 nrpe 세팅 
    $> vi /etc/xinetd.d/nrpe
    only_from = 127.0.0.1 localhost [ 이부분에 서버 IP 세팅 ]

    11. nrpe service 등록
    $>  chkconfig --level 2345 xinetd on
    $> chmod 600 /etc/services
    $>  vi /etc/services       
    nrpe            5666/tcp                        # nagios NRPE
    $> chmod 400 /etc/services
    $> service xinetd restart

    12. nrpe 확인
    $> netstat -at | grep nrpe 

    # /usr/local/nagios/libexec/check_nrpe -H localhost
    NRPE v2.13

    13. DB 에 nagios 유저 생성 
    mysql > create user nagios@'192.118.222.44' identified by 'nagios'; 
    mysql > grant all privileges on *.* to nagios@'192.1168.222.44'


    14. 원격서버에서 실행할  명령 등록
    Cd /usr/local/nagios/etc
    #> vi /usr/local/nagios/etc/nrpe.cfg
    command[check_data]=/usr/local/nagios/libexec/check_disk -w 30% -c 10% -p /dev/sdc1
    command[check_log]=/usr/local/nagios/libexec/check_disk -w 30% -c 10% -p /dev/sdb1
    command[check_root]=/usr/local/nagios/libexec/check_disk -w 30% -c 10% -p /dev/sda3
    command[check_cpu]=/usr/local/nagios/libexec/check_cpu -w 60 -c 90 
    command[check_mem]=/usr/local/nagios/libexec/check_mem -w 70 -c 90 
    command[check_disk_util]=/usr/local/nagios/libexec/check_iostat -w 50 -c 80 -d sdc

    $> service xinetd restart



      3. 각종 팁

    1. Nagios 의 웹화면 접속 (80포트)
       http://nagios 서버 접속Ip/nagios 
    2. nagios 웹하면 갱신 주기를 변경하려면 cgi.cfg 파일 변경 (초단위) 
       $ > vi /usr/local/nagios/etc/cgi.cfg
        refresh_rate=30

    3. Server Host 부분에 Group 단위를 모니터링 할때 3개의 단위만 CSS 로 정렬되는데 4개 Group 을 한화면에 봐야 할경우 Nagios 소스를 수정하고 다시 컴파일 해야함. 
       소스폴더에서 cgi/status.c 파일을 열어 int overview_columns = 3 부분을 4로 변경하고, 서버를 컴파일 해서 nagios 를 기동하면 한화면에 4개의 그룹, 5개의 그룹등을 볼수 있음.