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