[출처] http://www.mimul.com/pebble/default/2013/12/07/1386399914136.html



대용량 테이블을 운용하는 경우 도움이 될만한 아티클 "Ten ways to improve the performance of large tables in MySQL"이 있어, 이 블로그에 정리해 봅니다.
아래 가지 10가지 방법을 잘 고민해 보면 좋은 도움을 받을 수 있을 것 같습니다.

오늘은 성능 문제를 일으키는 원인이 되는 대용량 테이블의 성능을 개선하는 방법을 살펴본다. 여기의 조언들은 일부는 많은 테이블을 가진 큰 데이터베이스에 적용할 수 있지만 대부분의 경우는 개별적으로 특별히 큰 테이블이 더 큰 문제라는 것이다.

테이블의 내용 변경의 속도는 테이블 사이즈가 커질수록 줄어드는 것을 일반적으로 알려진 사실이다. 아래는 B+Tree 인덱스의 성능을 시계열로 보여주는 그래프이다.



위의 그래프는 MySQL@Facebook에서 포스팅한 것이다. 이것은 insert buffer를 해제한 상태(물론 추천 하지는 않고, 데모 목적)에서 테이블에 10억 행을 insert했을 때의 성능 저하를 나타낸 것이다. 이 벤치 마크는 iibench도구를 사용했고, TokuTek에서 디자인한 것이다.

그래서 우리는 이러한 성능 저하가 인덱스 구조에 의한 것이라고 생각했지만, 그래도 우리는 이 곡선을 급격하게 내려가지 않고, 옆으로 길게 늘어지도록 할 수 있는 방법을 모색해 봐야 한다.

대용량 테이블의 성능에 영향을 줄일 수 있는 10가지 방법

1. MyISAM 대신에 InnoDB를 사용하자. MyISAM은 테이블의 마지막에 insert하는 경우에는 속도가 빠르지만, 테이블 잠금(update 및 delete에 제한 되지만)이 있고, 데이터를 디스크에서 읽기와 쓰기를 할 때 경합 때문에 키 버퍼를 보호하기 위해 싱글락을 사용한다. 또한 후술하겠지만, 체인지 버퍼 기능을 가지고 있지 않다.

2. InnoDB는 유니크하지 않은 보조 인덱스의 빌딩을 지연시키는 체인지 버퍼 기능(이전에 insert buffer라고 불리던 기능)을 가지고 있다. 이에 대한 자세한 것은 Facebook의 노트에 기술되어 있다. 이것은 위의 그래프에는 보여지지 않지만, insert의 성능을 상당히 빠르게하는 것으로, 기본적으로 활성화되어 있다. 이 기능은 MySQL 5.5에서 좋게 개선 되었기 때문에, 만약 업그레이드 하지 않는 경우에는 즉시하는 것이 좋다.

3. 파티셔닝은 인덱스의 크기를 작게하여 테이블 자체를 효율적으로 작게 나눌 수 있게 된다. 또한, MySQL 5.7.2 DMR에서 상당히 개선된 내부적인 인덱스 잠금(index->lock) 경합(contention)도 줄여 준다.

4. InnoDB의 압축 기능을 사용하자. 몇몇 부하 종류의(특별히 많은 char/varchar/text형 컬럼이있는 경우) 압축 기능은 데이터를 압축해 성능 저하의 곡선을 완만하게 해준다. 또한, 일반적으로 용량이 작은 SSD를 사용해도 된다. InnoDB의 압축 기능은 Facebook에서 제공한 여러가지 패치 덕택에 MySQL 5.6에서는 크게 개선 되었다.

5. 정렬후 대용량의 데이터를 테이블에 로드해라. 정렬된 데이터를 인서트하는 것은, 페이지 분할(메모리 상에 없는 테이블에서 성능은 악화되는)이 작게 될 것이고, 대용량 데이터의 로드는 테이블의 용량과는 특별히 관계가 없지만, redo 로그의 압축 부하를 줄여주는데 도움을 준다.

6. 테이블에서 불필요한 인덱스를 지우자. 체인지 버퍼 기능을 비활성화시키는 UNIQUE 키를 특히 주의하자. 제약 조건을 사용할 이유가 없는 경우, UNIQUE 키를 사용하지 않고 일반적인 INDEX를 사용하자.

7. 5, 6에서 관련된 PRIMARY KEY의 종류도 중요하다. 성능 저하를 빠르게 만들어버리는 GUID와 같은 데이터 타입보다, INT나 BIGINT를 사용하자. PRIMERY KEY가 없는 것도 성능에 부정적인 영향을 준다.

8. 새 테이블에 대용량 데이터를 로드할 경우 PRIMARY KEY가 아닌 인덱스는 나중에 만들자. 모든 데이터가 로드된 후 인덱스를 만든다면, InnoDB는 pre-sort와 및 대용량 로드 프로세스(빠르고 인덱스가 좀 더 콤팩트한 인덱스를 만드는)를 적용 할 수 있게 된다. 이 최적화는 MySQL 5.5에서 이루어졌다.

9. 메모리가 많으면 많을수록 도움을 받을 수 있다. 최근의 메모리의 실제 가격을 비교해 보면 새로운 데이터 베이스 서버에 너무 적은 메모리를 적용하는 것을 자주 볼 수 있다. 간단한 조언을 해 보면, SHOW ENGINE INNODB STATUS의 결과에서 BUFFER POOL AND MEMORY의 reads/s의 보여주고(읽고 있음을 나타냄), Free buffers(이것도 BUFFER POOL AND MEMORY 아래에 있다)의 수가 0이면 메모리를 더 늘리면 혜택이 얻을 수 있다.(innodb_buffer_pool_size를 잘 최적화했다는 가정하에. 이 문서를 참고).

10. 메모리 뿐만 아니라, SSD도 도움이 된다. 그래프의 곡선이 하향이 되는 이유는 테이블이 커져서 일어나는 IO 속성 때문이다. 하드 디스크가 초당 200 오퍼레이션(IOPS)을 수행하는데 반해, 일반적인 SSD는 20000 IOPS 이상 수행이 가능하다.

용어 정의

  • Change Buffer: MySQL 5.5이전에는 insert buffer라고 했으며, 이름 그대로 INSERT의 성능을 향상시키기 위한 버퍼다. insert buffer는 새로운 행을 삽입하는 INSERT에 대해서만 유효했는데, Change Buffer는 UPDATE 및 DELETE도 좋은 효율성을 보여준다.


반응형

Spine / Poller 설정


 - cacti 는 기본적으로 매 5분 단위로 체크를 하게 되는데, Spine 를 설정함으로써 매분간 체크를 할 수 있다.

 - Spine 를 설치하면 multi process 및 thread로 성능을 향상시킬 수 있다.

 - 이것 또한 해당 까페에 동일하게 잘 정리되어 있지만 여기서 에러난 부분에 대해서 정리해 보았다.


- 다운로드 : http://www.cacti.net/spine_download.php


wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.8b.tar.gz


압축을 푼 후 ./configure 를 하게 된다. 여기서 에러가 2번 발생한 부분에 대해 정리해 본다.


./configure 

[root@Cacti cacti-spine-0.8.8b]# ./configure

checking build system type... x86_64-unknown-linux-gnu

checking host system type... x86_64-unknown-linux-gnu

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... /bin/mkdir -p

checking for gawk... gawk

checking whether make sets $(MAKE)... yes

checking whether make supports nested variables... yes

checking for gawk... (cached) gawk

checking for gcc... no

checking for cc... no

checking for cl.exe... no

configure: error: in `/home/spine/cacti-spine-0.8.8b':

configure: error: no acceptable C compiler found in $PATH

See `config.log' for more details


해결방법

yum -y install gcc


설치 후 다시 진행


참조 : http://junemoon.tistory.com/30


./configure


checking for netinet/in_systm.h... yes

checking for netinet/in.h... yes

checking for netinet/ip.h... yes

checking for netinet/ip_icmp.h... yes

checking for unsigned long long... yes

checking for long long... yes

checking for an ANSI C-conforming const... yes

checking for size_t... yes

checking whether time.h and sys/time.h may both be included... yes

checking whether struct tm is in sys/time.h or time.h... time.h

checking return type of signal handlers... void

checking for malloc... yes

checking for calloc... yes

checking for gettimeofday... yes

checking for strerror... yes

checking for strtoll... yes

checking priv.h usability... no

checking priv.h presence... no

checking for priv.h... no

checking whether we are using Solaris privileges... no

checking sys/capability.h usability... no

checking sys/capability.h presence... no

checking for sys/capability.h... no

checking whether we are using Linux Capabilities... no

configure: error: Cannot find MySQL headers.  Use --with-mysql= to specify non-default path.



해결방법


yum install mysql-devel


위의 mysql-devel 설치


설치 후 다시 진행해 보자


./configure


checking for the maximum MySQL buffer size... 65536

checking whether we are using traditional popen... no

checking whether to verify net-snmp library vs header versions... no

checking for glibc gethostbyname_r... yes

checking for Solaris/Irix gethostbyname_r... no

checking for HP-UX gethostbyname_r... no

checking that generated files are newer than configure... done

configure: creating ./config.status

config.status: creating Makefile

config.status: creating config/config.h

config.status: executing depfiles commands

config.status: executing libtool commands


이제 make 및 install 진행해 보자


make && make install


spine.conf 수정


cp /usr/local/spine/etc/spine.conf.dist /usr/local/spine/etc/spine.conf

vi /usr/local/spine/etc/spine.conf


해당 DB 정보들을 수정해 주자

DB_Host         localhost
DB_Database     cacti
DB_User         cacti
DB_Pass         cacti
DB_Port         3306
DB_PreG         0


Cacti 에 등록을 진행하자.

해당 방법들은 모두 캡쳐해서 사진으로 대처




설정이 완료 되면 1분마다 체크하는지 로그를 확인해 보자


이것으로 Spine 설치 및 설정까지 완료 된 것을 확인할 수 있다.


이후 Percona Script 적용까지 진행 해 보았다.


반응형

'Monitoring > Cacti' 카테고리의 다른 글

[Cacti] 설치 -> MySQL Power group 참조  (0) 2016.07.27

http://cafe.naver.com/mysqlpg/16


해당 까페를 자주 보는데, 여기서 찾아서 진행 했다.

그래서 따로 퍼와서 작성하기에는 문제가 있을것 같아서 해당 링크를 연결했다.



반응형

'Monitoring > Cacti' 카테고리의 다른 글

[Cacti] Spine 설치 에러  (0) 2016.07.27

+ Recent posts