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

    댓글 없음:

    댓글 쓰기