가상화 OS 솔루션은 MS, Citrix, Vmware의 3개사로 압축되어 경쟁중이다.

 

특히, 가상화 솔루션은 Citrix의 XenServer와 VMware의 WMware Server(workstataion)가 유명하다.

올해 3월부터 wmware는 vmware Server를 Free로 선포했다. 아마도 약간의 위험을 느낀 듯 합니다.

 

 

 

vmware 2.0beta가 나왔다..

http://www.vmware.com/beta/server/index.html

 

 

둘을 비교중인데..

개인적으로..  xen쪽이 io쪽으로 약간 성능이 나은 거 같다.. (물론 개인적이다.!!)

Posted by '김용환'
,

졸트 상 Jolt award

Trend 2008. 5. 23. 20:03

 

 

최근에 졸트 상 수상자를 발표했다.

Beautiful code가 위너란다~

 

http://www.joltawards.com/history/winners.html

The Winners of the 18th Jolt Product Excellence Awards
& the Recipients of the Jolt Productivity Awards Are:

JOLT HALL OF FAME WINNER:

  • VMware Workstation

General Books

Jolt Winner:

  • Beautiful Code Edited by Andy Oram and Greg Wilson (O'Reilly Media)

Productivity Winners:

  • Manage It! Your Guide to Modern Pragmatic Project Management by Johanna Rothman (Pragmatic Bookshelf)
  • The Myths of Innovation by Scott Berkun (O'Reilly Media)
  • Release It! Design and Deploy Production-Ready Software by Michael T. Nygard(Pragmatic Bookshelf)

Technical Books

Jolt Winner:

  • Continuous Integration: Improving Software Quality and Reducing Risk by Paul Duvall, Steve Matyas, Andrew Glover (Addison-Wesley Professional)

Productivity Winners:

  • xUnit Test Patterns: Refactoring Test Code by Gerard Meszaros (Addison-Wesley Professional)
  • Head First SQL: Your Brain on SQL — A Learner's Guide by Lynn Beighley (O'Reilly Media)
  • The Rails Way by Obie Fernandez (Addison-Wesley Professional)

Change and Configuration Management

Jolt Winner:

  • FishEye (Atlassian)

Productivity Winners:

  • IncrediBuild (Xoreax Software)
  • Surround SCM (Seapine Software)
  • DiffMerge (SourceGear)

Collaboration Tools

Jolt Winner:

  • Code Collaborator (Smart Bear)

Productivity Winners:

  • codeBeamer 5.0 (Intland Software)
  • Confluence (Atlassian)
  • TeamCity (JetBrains)

Database Engines and Data Tools

Jolt Winner:

  • AquaLogic Data Services Platform (BEA Systems)

Productivity Winners:

  • Aleri Streaming Platform (Aleri)
  • Crystal Reports (Business Objects)
  • EnterpriseDB Advanced Server (EnterpriseDB)

Design and Modeling Tools

Jolt Winner:

  • Corticon Business Rules Modeling Studio (Corticon Technologies)

Productivity Winners:

  • BigLever Software Gears (BigLever Software)
  • Enterprise Architect (Sparx Systems)
  • Structure101 for Java (Headway Software)

Development Environments

Jolt Winner:

  • NetBeans IDE 6 (Sun Microsystems)

Productivity Winners:

  • IntelliJ IDEA (JetBrains)
  • CodeRush with Refactor! Pro (Developer Express)
  • Komodo IDE 4 (ActiveState)

Enterprise Tools

Jolt Winner:

  • Kapow Mashup Server, Web 2.0 Edition (Kapow Technologies)

Productivity Winners:

  • Adobe LiveCycle Enterprise Suite (Adobe Systems)
  • Foglight (Quest Software)
  • Rally Enterprise (Rally Software Development)

Libraries, Frameworks and Components

Jolt Winner:

  • Guice (Google)

Productivity Winners:

  • Eclipse Modeling Project (Eclipse Foundation)
  • Zend Framework (Zend Technologies)
  • JasperReports (JasperSoft)

Mobile Development Tools

Jolt Winner:

  • Mojax (mFoundry)

Productivity Winners:

  • Adobe Device Central CS3 (Adobe Systems)
  • Eclipse Embedded Rich Client Platform (Eclipse Foundation)
  • NetBeans IDE 6 with Sun Java Wireless Toolkit 2.5.2 (Sun Microsystems)

Project Management Tools

Jolt Winner:

  • Rally Enterprise (Rally Software Development)

Productivity Winners:

    vResultSpace (Sapient)
  • TargetProcess On-Demand (TargetProcess)
  • TeamCity (JetBrains)

Security Tools

Jolt Winner:

  • Fortify Defender: Real-Time Analyzer (Fortify Software)

Productivity Winners:

  • Crowd (Atlassian)
  • DEFENSICS (Codenomicon)
  • Ounce (Ounce Labs)

Testing Tools

Jolt Winner:

  • Clover 2.0 (Atlassian)

Productivity Winners:

  • JUnit Factory (Agitar Software)
  • SOAPscope Tester (Mindreef)
  • TestComplete Enterprise (AutomatedQA)

Utilities

Jolt Winner:

  • VMware Workstation (VMware)

Productivity Winners:

  • Adobe Captivate 3 (Adobe Systems)
  • DemoWorks 2007 (ComponentOne)
  • ANTS Profiler 3 (Red Gate Software)

Web Development

Jolt Winner:

  • Adobe ColdFusion 8 (Adobe Systems)

Productivity Winners:

  • 3rdRail (CodeGear)
  • NetBeans IDE 6 (Sun Microsystems)
  • RSSBus (/n software)

Websites and Developer Networks

Jolt Winner:

  • O'Reilly Radar (O'Reilly Media)

Productivity Winners:

  • CM Crossroads (CMC Media)
  • Safari Books Online
  • The Code Project

'Trend' 카테고리의 다른 글

Google Sites  (0) 2008.05.27
가상화 솔루션 XenServer & Vmware  (0) 2008.05.23
World WideTelescope 맛뵈기  (1) 2008.05.16
Limo 플랫폼 -SK 텔레콤 가입  (0) 2008.05.14
Google Oceans  (0) 2008.05.07
Posted by '김용환'
,

 


<MyISAM 튜닝>
1. 기본 설정
Key_buffer_size (기본 8Mb)
Myisam_sort_buffer_size (기본 8Mb)
Myisam_repair_threads (기본 1)
2. 이슈
key 캐시를 조정하는 것이 쿼리 성능을 높인다.
실제 데이터 row에 대한 캐시는 OS레벨에서 작동된다.
3. 성능과 연관있는 변수
- key_block_used와 key_block_unused는 얼마나 많은 쿼리캐시 공간이 사용 중인지 나타낸다.
- key_cache_block_size로 블록 사이즈를 결정한다.
- Key_buffer_size 가 높으면, 메모리가 더 할당되어 key핸들링에 사용된다. 이 값을 물리적 메모리의 25% 정도를 할당한다., 너무 크게 올리면 swapping이 일어나 성능이 저하된다.
- key_reads는 낮아야 한다.
- key_reads/key_read_requests 힛트율이 낮아야 한다.
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| Key_blocks_not_flushed | 0      |
| Key_blocks_unused      | 115964 |
| Key_blocks_used        | 16     |
| Key_read_requests      | 1125   |
| Key_reads              | 17     |
| Key_write_requests     | 65     |
| Key_writes             | 65     |
+------------------------+--------+
- Myisam_sort_buffer_size : 인덱스 생성에 사용되는 메모리의 양
- Myisam_repair_threads : 1이상으로 설정할 경우 병렬로 인덱스 생성이 가능

'DB' 카테고리의 다른 글

mysql - select 결과를 파일로 덤프하기  (0) 2008.06.24
mysql) 예약어  (0) 2008.05.27
mysql-성능튜닝 #4(innodb)  (0) 2008.05.23
mysql-성능튜닝 #2  (0) 2008.05.23
mysql- 성능 튜닝 #1  (0) 2008.05.23
Posted by '김용환'
,

mysql-성능튜닝 #4(innodb)

DB 2008. 5. 23. 07:03

 

<InnoDB 튜닝>
1. 관련 변수
- Innodb_buffer_pool_size (기본값 8Mb) : InnoDB가 사용하는 메모리 버퍼의 사이즈, OS Cache 보다 훨씬 효율적으로 메모리를 사용하여 Write 성능에 큰 영향을 미친다.
- Innodb_additional_mem_pool : Data Dictionary를 저장하기 위해서 사용되며 필요한 경우 자동으로 증가한다
- Innodb_log_file_size : InnoDB redo로그 파일 크기,  Write 성능에 영향을 미친다. 크기에 따라 InnoDB의 복구 시간이 증가한다.
- Innodb_log_files_in_group : 로그 그룹 안에 포함될 로그 파일의 수
- Innodb_log_buffer_size : 로그 버퍼 크기. 1초에 한번씩 flush 됨
- Innodb_flush_log_at_trx_commit (기본값은 1)
  : 0으로 설정하면 1초에 한번씩 디스크에 기록하고 싱크한다.
  : 1로 설정하면 commit이 발생할 때마다 디스크에 싱크한다.
  : 2로 설정하면 commit할 때마다 디스크에 기록하나 싱크는 1초에 한번만 한다.
  : 0으로 설정할 경우 여러 트랜잭션을 1초마다 한번씩 모아서 디스크에 기록함으로써 인서트 성능을 대폭 향상시키나 서버가 갑자기 다운될 경우 1초간의 트랜잭션은 상실된다.
- Innodb_thread_concurrency (기본값은 8) : InnoDB가 동시 사용가능한 최대 시스템 쓰래드 수
- foreign_key_checks/unique_checks :  InnoDB는 데이터 로드 시 기본적으로 외부키 및 키의 유일성에 대한 체크를 함께 한다. 이런 부분때문에 속도가 저하될 수 있다.
- innodb_fast_shutdown : Shutdown시 InnoDB가 내부적으로 수행하게 되는 내부 메모리 구조 정리 작업과 Insert 버퍼 정리 작업을 안한다.
- innodb_status_file: mysql 시작 옵션을  주어 InnoDB는 정기적으로 데이터의 결과를 datadir/innodb status.pid라는 파일로 저장할 수 있다.
mysql> SHOW STATUS LIKE 'innodb%'
    -> ;
+-----------------------------------+------------+
| Variable_name                     | Value      |
+-----------------------------------+------------+
| Innodb_buffer_pool_pages_data     | 32925      |
| Innodb_buffer_pool_pages_dirty    | 0          |
| Innodb_buffer_pool_pages_flushed  | 2590193    |
| Innodb_buffer_pool_pages_free     | 32609      |
| Innodb_buffer_pool_pages_latched  | 0          |
| Innodb_buffer_pool_pages_misc     | 2          |
| Innodb_buffer_pool_pages_total    | 65536      |
| Innodb_buffer_pool_read_ahead_rnd | 0          |
| Innodb_buffer_pool_read_ahead_seq | 0          |
| Innodb_buffer_pool_read_requests  | 347929888  |
| Innodb_buffer_pool_reads          | 0          |
| Innodb_buffer_pool_wait_free      | 0          |
| Innodb_buffer_pool_write_requests | 34301551   |
| Innodb_data_fsyncs                | 960103     |
| Innodb_data_pending_fsyncs        | 0          |
| Innodb_data_pending_reads         | 0          |
| Innodb_data_pending_writes        | 0          |
| Innodb_data_read                  | 0          |
| Innodb_data_reads                 | 0          |
| Innodb_data_writes                | 2275182    |
| Innodb_data_written               | 2474565120 |
| Innodb_dblwr_pages_written        | 2590020    |
| Innodb_dblwr_writes               | 160386     |
| Innodb_log_waits                  | 0          |
| Innodb_log_write_requests         | 15814690   |
| Innodb_log_writes                 | 426023     |
| Innodb_os_log_fsyncs              | 536863     |
| Innodb_os_log_pending_fsyncs      | 0          |
| Innodb_os_log_pending_writes      | 0          |
| Innodb_os_log_written             | 3444500992 |
| Innodb_page_size                  | 16384      |
| Innodb_pages_created              | 32925      |
| Innodb_pages_read                 | 0          |
| Innodb_pages_written              | 2590193    |
| Innodb_row_lock_current_waits     | 0          |
| Innodb_row_lock_time              | 0          |
| Innodb_row_lock_time_avg          | 0          |
| Innodb_row_lock_time_max          | 0          |
| Innodb_row_lock_waits             | 0          |
| Innodb_rows_deleted               | 10         |
| Innodb_rows_inserted              | 108029     |
| Innodb_rows_read                  | 51046757   |
| Innodb_rows_updated               | 3966034    |
+-----------------------------------+------------+
mysql> show engine innodb status;
....
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 1198565838; in additional pool allocated 10850304
Buffer pool size   65536
Free buffers       32609
Database pages     32925
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 0, created 32925, written 2590211
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000


2. 이슈

InnoDB의 flush를 지정할 수 있다. unix계통에서는 fsync사용한다.

'DB' 카테고리의 다른 글

mysql) 예약어  (0) 2008.05.27
mysql-성능튜닝#3(mysisam튜닝)  (0) 2008.05.23
mysql-성능튜닝 #2  (0) 2008.05.23
mysql- 성능 튜닝 #1  (0) 2008.05.23
mysql 의 wait_timeout의 의미  (0) 2008.05.23
Posted by '김용환'
,

mysql-성능튜닝 #2

DB 2008. 5. 23. 07:02


1. mysql은 동적으로 변화 가능한 옵션은 3가지로 나눌 수 있다.
- session : 조정된 값은 오직 현재 커넥션에만 영향을 미친다.
- global : 조정된 값이 전체 서버에 영향을 미친다.
- both : 값을 변화시킬 때 session/global을 반드시 명기해야 한다.


mysql> show global variables like 'query%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_alloc_block_size       | 8192    |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
| query_prealloc_size          | 8192    |
+------------------------------+---------+
7 rows in set (0.00 sec)

mysql> show session variables like 'query%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_alloc_block_size       | 8192    |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
| query_prealloc_size          | 8192    |
+------------------------------+---------+
7 rows in set (0.00 sec)


2.  변경된 옵션 적용하기
set global(또는 session) parameter =value
- 동작 중에 변경된 옵션은 서버 재 시작 전까지미만 적용된다.
- 영구히 변경하려면, /etc/my.cnf 파일을 수정해야 한다.
- super 권한이 있어야 바꿀 수 있다.

3. 주요 옵션 (show varialbles like '...%' 이용)
(1) table_cache (디폴트 64): 사용하는 테이블에 대한 핸들러를 캐시에 저장, opend_tables 항목이 높을 경우 table_cache를 높인다.
(2) thread_cache_size(디폴트 0) : 재 사용을 위해 보관할 쓰래드 수, thread_created가 높을 경우 증가된다. 클라이언트가 커넥션 풀을 쓰는 경우는 의미가 없다.
(3) max_connections(기본 100) : 허용 가능한 최대 동시 접속수, 쓰레드 관련 메모리 튜닝시 매우 중요, 각각의 커넥션은 최소 thread_stack의 사이즈만큼의 메모리 사용
(4) connect_timeout  : connect요청받고 몇초간 기다릴지
(5) net_buffer_length : 클라이언트에 보내는 초기 메시지의 바이트 수 조절한다.
(6) max_allowd_packet : 서버 / 클라이언트간 최대 전송 가능 패킷 크기를 설정한다., Text나 bloc컬럼이 많이 있거나, 리플리케이션을 하는 경우 최소 16M이상 잡아야 한다.
(7) back_log (디폴트 50) : connection이 대량으로 몰릴 때 큐에 대기가능한 커넥션의 갯수
(8) wait_timeout : 커넥션의 타임아웃
(9) net_retry_count : 통신이 잘못되어 실패할 때, 몇 번까지 재시도할지
(10) max_connect_error : 계속적으로 문제를 발생시키는 클라이언트를 몇번째 재시도후 block할지 지정. 한번 block되면, 서버를 재시작하거나 flush host명령을 실행하기 전까지 접속 불가 일반적인 경우.. 내부에서만 쓸 경우가 많아서 크게 잡아놓음
   나의 경우는 다음과 같이 지정
max_connections를 1000, 이때  thread_stack은 196608, thread_cache_size는 4.
connect_timeout : 5,  max_allowed_packet : 33,553,408(리플리케이션 적용) , back_log는 50
max_user_connections : 0 ,  max_connect_errors  99999999


3. 주요 환경변수 (show staus like 'thread..%' 이용)
(1) Connection관련
- Max_used_connections (720) : 피크 타임의 동시 접속 수, 튜닝의 제일 중요한 요소임
- Bytes_received (3656293909) / Bytes_sent (1293843766) : 모든 클라이언트와 전송된 바이트의 총합
- connections( 2045524 ) : 시도된 connection의 합
- Aborted_connects (40979) : 어플리케이션 또는 mysql의 커넥션 관련 옵션이 잘 못 될 수 있다.
(2) Thread 관련
-thread_created:서버 시작후, 현재까지 만들어진 총 쓰레드의 갯수
-thread_connected: 현재 열려있는 쓰레드수
-thread_cached : 재사용 가능한 동작 중이지 않은 쓰레드
-thread_running : sleeping 상태가 아닌 쓰레드 수
 [master]
| Threads_cached    | 43    |
| Threads_connected | 23    |
| Threads_created   | 66    |
| Threads_running   | 3     |
 [slave]
| Threads_cached    | 120   |
| Threads_connected | 383   |
| Threads_created   | 1681  |
| Threads_running   | 1     |
- slow_launch_threads :쓰래드 생성에 걸린 시간이 slow_launch_time 이상 걸린 쓰래드의 수. Slow_launch_time은 기본 2초이다. 0에 가까와야 좋은 것이다. 내 db는 0이군.
 *쓰레드 캐쉬의 적중률은  threads_created/connections로 계산 가능
A DB(캐슁용) : 1681/1505789 : 0.1%의 쓰레드 캐쉬의 적중률을 보여준다 (현재 thread_cache_size : 4)
B DB(어드민용) : 179348 / 2046107  : 8.7%의 쓰레드 캐쉬의 적중률을 보여준다 (현재 thread_cache_size : 128 )
=>thread_cache_size나 높여볼까나? 확실히 thread_cache_size가 높은 것이 훨씬 높다.
(3) Handler
일반적인 해석
  - handler_read_first가 높은 경우  많은 풀 인덱스 스캔이 이루어짐
  - handler_read_next가 높은 경우  풀 인덱스 스캔과 레인지 스캔이 이루어짐
  - handler_read_rnd가 높은 경우  많은 풀 테이블 스캔과 레인지 스캔이 이루어짐
  - handler_read_key가 높은 경우  인덱스를 읽는 경우가 많음
 [A DB(캐슁용)] => 별 튜닝 요소가 없다.
| Handler_commit             | 0     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 0     |
| Handler_read_key           | 0     |
| Handler_read_next          | 0     |
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 19    |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 25    |
 [B DB(어드민용)] =>튜닝 요소가 많다.  많은 풀 테이블 스캔과 레인지 스캔이 이루어지는 것 같다.
| Handler_commit        | 199415     |
| Handler_delete        | 269322     |
| Handler_discover      | 0          |
| Handler_read_first    | 67565      |
| Handler_read_key      | 13910141   |
| Handler_read_next     | 429593667  |
| Handler_read_prev     | 2196569    |
| Handler_read_rnd      | 372568     |
| Handler_read_rnd_next | 2211096685 |
| Handler_rollback      | 1415609    |
| Handler_update        | 595584     |
| Handler_write         | 2026479    |

 

4. 성능
(1) MySQL의 느린 응답을 나타낸다. => slow_queries와 slow_launch_threads
(2) 부하가 심하다는 것을 나타낸다 =>   threads_created,  max_used_connections,  opend_tables이 큰 경우 (이 경우 table_cache를 올리자)
(3) 인덱스를 많이 읽는다. => handler_read_key가 높은 경우 
(4) 락 경쟁과 관련된 항목 =>  table_locks_waited VS table_locks_immediate , 만약 table_locks_waited가 높으면, myisam에서 innodb로 변경하는 것이 좋다.
A DB(캐슁)
| Table_locks_immediate | 20498565 |
| Table_locks_waited    | 0        |
B DB(어드민)
| Table_locks_immediate | 9500191 |
| Table_locks_waited    | 12509   |
(5) 메모리에 적용할 수 없는 큰 임시 테이블이 많이 만들어졌다 => created_tmp_disk_tables
=>  tmp_table_size를 올려서 과도한 DISK I/O가 발생하는 것을 막는다. 즉, 디스크를 안쓰고, 메모리를 쓰도록 한다.
A DB(캐슁) |Created_tmp_disk_tables | 0   (tmp_table_size | 67108864 )
B DB(어드민)| Created_tmp_disk_tables | 107  ( tmp_table_size | 33554432 )
(6)  select쿼리가 최적화 되지 못했다 => Select_xxx
=> select_full_join과 select_range_check는 많거나 다른 인덱스가 필요하다.
(6) sort_xxx 환경변수들의 값이 크다 => 쿼리에 따라 ordering 및 grouping 비용 크다.
=> sort_buffer_size가 크게 설정한다. 25%이상의 성능 향상을 기대할 수 있다. sort_buffer에 데이터를 정렬 한 후 실제 결과값을 처리하는 것은 read_rnd_buffer_size에 영향을 준다.
  

5. 최적화
(1) Table Cache 최적화
- table_cache 값을 올릴 때, mysqld가 필요로 하는 file descriptor의 수가 증가한다.
- MyISAM 엔진을 사용하는 경우 열려있는 각각의 테이블에 대해 하나의 file descriptor가 필요하게 되고, 게다가 인덱스 파일을 위해 하나의 file descriptor가 더 필요하다.
- 대부분의 운영체제에서는 프로세스당 사용할 수 있는 file descriptor의 수가 제한되는데, 이를 위해서 ulimit을 이용해서 file descript를 최대한 unlimited로 수정하는 것이 좋다.
- Opend_table 환경변수가 높을 때, 그리고 FLUSH TABLE을 자주 수행하지 않는다면 table_cache를 높이는 것이 좋다.
(2) Table Scan 최적화
- 디스크 억세스를 줄이기 위해 read_buffer가 사용된다.
- read_buffer_size는 기본 128Kb의 크기를 가지고, 높을 수록 테이블 스캔의 성능을 높여준다.
- 높여주되 지나치게 큰 값을 잡는 것은 좋지 않다. 기본적으로 테이블 스캔을 수행하는 모든 쓰래드에 할당될 수 있다.
(3) Join
- 조인되는 컬럼에 인덱스가 존재하지 않을 경우 성능이 매우 떨어진다.
- 인덱스를 추가할 수 없는 경우 join_buffer_size를 높인다.
- 두 테이블 간에 풀 조인이 일어날 경우 하나의 join_buffer가 할당되고 인덱스가 적용되지 않는 조인의 테이블 수가 늘어나는 만큼의 join_buffer가 할당된다.
(4) querty cache
select 쿼리와 그 결과를 저장한다. Query_cache_size를 클 수록 쿼리 캐시 싸이즈도 커진다. 하지만, 테이블이 바뀌면, Query cache는 모두 reset된다.
query_cache_limit을 조정함으로써 쿼리 캐시에 저장될 최대 쿼리 크기를 조절할 수 있고, Query_cache_min_res_unit(block size)를 설정하여 쿼리 캐시의 조각화를 줄일 수도 있다. 기본값은 4K이다.
Qcache_hits 와 Com_select를 비교하여 쿼리 캐시 적중률을 계산하여 성능을 최적화 할 수 있다.

'DB' 카테고리의 다른 글

mysql-성능튜닝#3(mysisam튜닝)  (0) 2008.05.23
mysql-성능튜닝 #4(innodb)  (0) 2008.05.23
mysql- 성능 튜닝 #1  (0) 2008.05.23
mysql 의 wait_timeout의 의미  (0) 2008.05.23
mysql&gt; show variables  (0) 2008.05.23
Posted by '김용환'
,

mysql- 성능 튜닝 #1

DB 2008. 5. 23. 07:01

0. mysql 성능 모니터링
(1) 툴
[리눅스]
- vmstat, iostat, mpstat
[mysql]
- SHOW STATUS 커맨드를 통해 현재 서버 상태를 파악
- Cricket, SNMP 또는 자체 제작 스크립트를 사용
- MySQL Administrator
[기타툴]
mytop
innotop (http://www.xaprb.com/blog/2006/07/02/innotopmysql-innodb-monitor)


(2) mysql
show full processlist
show status (mysqladmin extended-status, MySQL Administrator이용)
ex) mysqladmin –i 1 extended-status      1초마다 mysql 의 전체 status 확인 가능

급박한 경우는 kill을 사용하면 된다. kill

시간이 오래걸리는 프로세는 perl코드를 이용하여 조절이 가능하다.
$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) {
    $process_id=$row["Id"];
    if ($row["Time"] > 200 ) {
        $sql="KILL $process_id";
        mysql_query($sql);
    }
}

 

 


1. staus 항목 분석
(1) com_xxx 항목은 서버 시작 이후 xxx 관련 명령이 얼마나 수행됐는지를 나타냄
ex) com_select는 총 수행된 select 쿼리 수
Com_begin, Com_commit, Com_rollback, Com_insert, Com_update, Com_select, Com_delete
(2) questions는 서버로 전송된 총 쿼리 수를 나타냄

'DB' 카테고리의 다른 글

mysql-성능튜닝 #4(innodb)  (0) 2008.05.23
mysql-성능튜닝 #2  (0) 2008.05.23
mysql 의 wait_timeout의 의미  (0) 2008.05.23
mysql&gt; show variables  (0) 2008.05.23
mysql 기본 설정 보기  (2) 2008.05.23
Posted by '김용환'
,

 

 

어느 날부터 java가  DB와의 연결이 timeout이 되어 버려 원인을 찾던중, 뜻밖의 좋은 문서를 발견하였다. wait_timeout이 정말 짧아서 나는 것인지, 아니면, 원인이 다른데에 있는지 원인을 찾던 중 좋은 문서를 발견하였다..

 

 

출처 :

http://www.linuxchannel.net/docs/mysql-timeout.txt

 

 

[MySQL] time out(wait_timeout) 계산과 설정

- 작성자 : 김칠봉 <san2(at)linuxchannel.net>
- 작성일 : 2003-08-11(보완, 그래프 추가)
           2003-08-04
- 내  용 : life time 계산에 의한 wait_timeout 설정
- 수  준 : 초중급 이상
- 키워드 : MySQL, wait_timeout, interactive_timeout, connect_timeout,
           max_connections, Aborted_clients, Connections,
           Max_used_connections, Slow_queries, Questions, Uptime

*주1)
이 문서에 대한 최신 내용은 아래 URL에서 확인할 수 있습니다.

http://www.linuxchannel.net/docs/mysql-timeout.txt

*주2)
이 문서에서 사용한 life time, EXP, CUR, PAS, POL, DEF, LPT ... 와 같은
용어는 필자가 자의적으로 붙인 가칭용어로써 공식적인 용어가 아닙니다.

---------------------------------------------------------
목차

0. 배경

1. MySQL의 time out
  1-1. connect_timeout
  1-2. interactive_timeout
  1-3. wait_timeout

2. 연결 취소율(POC)과 connection life time
  2-1. 연결 취소율(POC)
  2-2. connection life time

3. 임계 life time
  3-1. 현재 최대(최악) 예상 임계 life time (EXP)
  3-2. 현재 평균 임계 life time (CUR)
  3-3. 지난 과거 최대 임계 life time (PAS)
  3-4. 지난 과거 유추 최대 임계 life time (POL)

4. 임계 life time(LPT) 계산(예제)

5. wait_timeout 계산 및 보정

6. 결과 확인

7. 후기
---------------------------------------------------------


0. 배경

아주 바쁜 MySQL 서버에서는 간혹 'Too many connections' 이라는 에러를 만날
수 있을 겁니다.

대부분 이 에러를 해결하기 위해서,

  - max_connections
  - wait_timeout

이 두개의 파라메터를 튜닝하면서 설정하는 것이 일반적입니다.

그런데, MySQL 매뉴얼에는 이 에러에 대한 자세한 설명이 빠져 있습니다.

예를들어, 실제 Max_used_connections 이 한계 max_connections 에 도달하지 않았는데도
불구하고 이런 에러를 만나면 상당히 난처합니다.

이런 경우는 대부분  max_connections 값을 올리고, wait_timeout 값을 줄여서 튜닝
하곤 하지만 역시 정확한 튜닝이 어렵습니다.

실제로 좀더 정확하게 튜닝하기 위해서는,

  - 시스템 전체 상황(실제 어느 정도로 바쁜지에 대한 상대적 수치),
  - 초당 connections 수,
  - 커넥션당 평균 쿼리 요청수,
  - 커넥션당 생성된 평균 쓰레드 수
  - 초당 평균 전송량
  - DISK에 생성된 임시 테이블 생성 비율
  - Slow_queries
  - 한계 도달 N 초 계산
  - 커넥션 life time

이런 값들을 계산 및 고려하여,

  - max_connections
  - wait_timeout
  - back_log
  - thread_cache_size
  - key_buffer_size
  - record_buffer (read_buffer_size)
  - record_rnd_buffer
  - sort_buffer_size
  - 기타 메모리 설정

이런 파라메터에 설정을 해줘야 합니다.

실제 MySQL 서버의 파라메터 설정은,

  1) 사용가능한 최대 전체 데이터베이스 크기와 각 테이블 평균 크기 계산
  2) MySQL 이 사용하는 시스템 물리적 메모리 크기
  3) 1)에 의한 shared 메모리와 쓰레드 메모리 할당 및 계산
  4) 2)과 3)에 의한 최대 동시 접속 가능한 max_connections 계산
  5) time out 설정
  6) 그 외 설정
  7) 시스템을 운영하면서 지난 통계 데이터에 의한 설정값 다시 튜닝

이와 같은 순서로 튜닝해 나가야 합니다.

2)번과 3)번 같은 경우는

  MySQL 이 사용할 물리적 메모리 총합 =
  (
      key_buffer_size +
      (read_buffer_size + sort_buffer_size) * max_connections
  )

이와 같은 공식을 사용합니다.
전자의 key_buffer_size 는 모든 쓰레드들이 항상 공유해서 사용하는 shared
메모리이고, 그 밑의 두개는 각 쓰레드마다 사용하는 not shared 메모리입니다.

간략하게 정리하면 다음과 같습니다.

  MySQL caches(all threads shared)
  (
      - key_buffer_size	        : 8MB < INDEX key
      - table_cache             : 64 < number of open tables for all threads
      - thread_cache_size       : 0 < number of keep in a cache for reuse
  )

  MySQL buffers(not shared)
  (
      - join_buffer_size        : 1MB < FULL-JOIN
      - myisam_sort_buffer_size : 8MB < REPAIR, ALTER, LOAD
      - record_buffer           : 2MB < sequential scan allocates
      - record_rnd_buffer       : 2MB < ORDER BY(avoid disk)
      - sort_buffer             : 2MB < ORDER BY, GROUP BY
      - tmp_table_size          : 32MB < advanced GROUP BY(avoid disk)
  )

  MySQL memory size
  (
      - INDEX(key)              : 8MB < key_buffer_size (shared)
      - JOIN                    : 1MB < join_buffer_size (not shared)
      - RECORD(read)            : 2MB < record_buffer (not shared)
                                : 2MB < record_rnd_buffer (not shared)
      - SORT                    : 8MB < myisam_sort_buffer_size (not shared)
                                : 2MB < sort_buffer (not shared)
      - TABLE(temporary)        : 32MB< tmp_table_size(not shared)
  )

  MySQL timeout
  (
      - connect_timeout         : 5 > bad handshake timeout
      - interactive_timeout     : 28800 > interactive to re-interactive timeout
      - wait_timeout            : 28000 > none active to re-active timeout
  )

  MySQL connections
  (
       - max_connections        : 100 < 'to many connections' error
       - max_user_connections   : 0(no limit) < user limit
  )


이 글은 메모리 설정에 관한 내용은 상당히 방대하므로 여기에서는 제외하고,
MySQL 의 time out 계산에 관한 내용입니다.

  이 글의 전제 조건
  (
      - MySQL 서버가 상당히 바빠서 time out 설정이 필요하다.
      - 서버의 바쁜 정도와 데이터베이스 크기에서 계산한
        max_connections 설정값이 현재 MySQL 서버의 한계점이다.
        (초과시 서버 증설이 필요함)
      - 연결 취소율(Aborted_clients*100/Connections)이 높은 경우
        (튜닝 기준 0.1% 또는 0.5% 이상)
  )

  time out 설정 목적
  (
      - 제한된 자원(메모리)의 효율적 이용
      - MySQL 성능 극대 (한계점에 극대, 한계점을 초과하지 않음)
      - 원할한 커넥션 처리
      - 절대적으로 불필요한 커넥션을 강제로 close(불필요한 커넥션 반환)
      - 기타
  )


1. MySQL의 time out

MySQL 서버(정확히 `mysqld')의 time out 설정은 크게 3가지가 있습니다.

  mysqld time out
  (
      - connect_timeout (bad handshake timeout)
      - interactive_timeout (interactive 모드에서 connection time out)
      - wait_timeout (none interactive 모드에서 connection time out)
  )

connect_timeout, interactive_timeout 은 튜닝과 좀 거리가 멀고,
실제로 바쁜 서버라면, 반드시 wait_timeout 을 따로 튜닝하여 설정해줘야 합니다.
(실제 이 글의 내용임)


1-1. connect_timeout

이 설정은 mysqld 와 mysql client 가 연결(connection)을 맺기 위해서
mysqld 가 연결 패킷을 기다리는 최대 시간입니다.

즉 TCP 연결을 맺는 과정(3-way handshake)에서, connect_timeout 동안에도
연결 패킷이 들어오지 않으면 연결이 실패(취소가 아님)되고,
bad handshake 로 응답합니다.

  *참고)
  (
      - 연결 실패 : 연결 과정중에서 fail 되는 경우 (Aborted_connects)
      - 연결 취소 : 연결이 된 상태에서 강제로 close 된 경우 (Aborted_clients)
  )

바꾸어 말하면 mysqld 와 mysql client 가 TCP 연결을 맺는 최대 시간으로
이 시간보다 큰 경우는 모두 Aborted_connects 에 해당됩니다.
(단위는 초)

  연결 실패율(POF) =
  (
      Aborted_connects * 100 / Connections
  )

  연결이 실패되는 경우
  (
      - 연결 패킷에 올바른 연결 정보가 없는 경우
      - 특정 user 가 권한이 없는 데이터베이스에 접근할 경우
      - mysqld 접근 password 가 틀린 경우
      - connect_timeout 보다 긴 연결 과정
  )

연결 실패율(POF)이 높은 경우는, 대부분 권한이 없는 데이터베이스 연결이나,
틀린 password 를 사용할 경우가 많습니다.

기본값은 대부분 5(초)로 설정되어 있으며, 따로 튜닝할 필요는 없습니다.
mysqld 의 --warnings 옵션 사용과 xxx.err 파일에 기록됩니다.


1-2. interactive_timeout

interactive 모드에서 time out 을 말합니다.
interactive 모드는 'mysql>' 과 같은 프롬프트 있는 콘솔이나 터미널 모드를
말합니다.

mysqld 와 mysql client 가 연결을 맺은 다음, 다음 쿼리까지 기다리는
최대 시간을 의미합니다.

설정된 interactive_timeout 까지도 아무런 요청(쿼리)이 없으면 연결은
취소되고, 그 이후에 다시 요청이 들어오면 연결은 자동으로 맺어집니다.

interactive_timeout 안에 다시 요청이 들어오면 wait time은 0으로 초기화
됩니다(CLIENT_INTERACTIVE).

  ERROR 2006: MySQL server has gone away
  No connection. Trying to reconnect...
  Connection id:    12002
  Current database: xxx

이와 같은 연결 취소는 Aborted_clients 에 누계되고, wait_timeout 의
결과도 함께 포함됩니다

기본 값은 28800(8시간) 초로 설정되어 있는데 상당히 관대한(?) 설정입니다.
약 1시간(3600) 정도로 설정하는 것을 권장합니다.


1-3. wait_timeout

이 설정은 제일 중요한 파라메터 항목입니다.

interactive 모드가 아닌 경우에 해당되며,
mysqld 와 mysql client 가 연결을 맺은 후, 다음 쿼리까지 기다리는
최대 시간을 의미합니다.

즉 대부분 PHP 나 C, PERL, python 등등의 API 를 이용한 client 프로그램
모드를 말합니다.

interactive_timeout 과 마찬가지로 wait_timeout 까지 아무런 요청(쿼리)이
없으면 연결은 취소되고 그 결과는 Aborted_clients 에 누계됩니다.

wait_timeout 안에 다시 요청이 들어오면 wait time 은 0 으로 초기화 됩니다.
(SESSION.WAIT_TIMEOUT)

  연결 취소율(POC) =
  (
      Aborted_clients * 100 / Connections
  )

  연결이 취소되는 경우(강제 종료됨)
  (
      - 종료(exit) 되기전 mysql_close() 가 없는 경우
      - wait_timeout 이나 interactive_timeout 시간까지 아무런 요청(쿼리)
        이 없는 경우
  )

기본 값은 interactive_timeout 과 마찬가지로 28800(8시간) 초로 설정되어
있는데, 역시 너무 관대한(?) 설정이라고 할 수 있습니다.

앞에서 연결 취소율(POC)을 계산해 보면, MySQL 서버가 어느 정도 비율로 강제
종료하는지 알 수 있습니다.

예를 들어 POC 가 1 % 이라면, 100 개의 커넥션당 하나 정도는 mysql_close()
없이 강제 종료(exit)되고 있다는 의미입니다.

이 값이 0 %에 가까울수록 좋습니다. 이 의미는 클라이언트 프로그램에서
모두 정상적으로 종료했다는 의미입니다.


2. 연결 취소율(POC)과 connection life time

2-1. 연결 취소율(POC)

연결 취소율 값이 지나치게 높으면, wait_timeout 설정이 너무 짧거나,
대부분 client 프로그램이 exit(종료)를 정상적으로 하지 않은 경우이므로 반드시
튜닝이 필요합니다.

특히 서버가 매우 바쁜 경우는, 이 wait_timeout 시간을 짧게 설정하여 불필요한
커넥션을 모두 제거해 줘야합니다(메모리 한계 문제).

  wait_timeout 튜닝이 필요한 경우
  (
      - 보통 POC(연결 취소율)가 1 % 이상인 경우
      - 아주 바쁜 서버에서는 튜닝전 0.01 % 이상인 경우
      - 기타 튜닝 기준에 따라 다름
  )

주의할 점은,

client 프로그램(예: PHP)을 수정하지 않는 상태에서, wait_timeout 을 튜닝하면
튜닝전에 비해서 POC 가 더 올라가야 정상입니다. 이 의미는 비정상적인 커넥션을
반환하는 비율이므로, 정상적인 서비스하에서 이 값이 올라가야 함을 이미합니다.

  warning
  (
      이하 다루는 'life time' 이나 '임계 life time' 등의 내용은 반드시
      wait_timeout 튜닝이 필요한 경우에 해당됩니다.

      만약, wait_timeout 튜닝이 필요하지 않다면 이하 내용을 필요하지 않습니다.
  )


그럼 이제 wait_timeout 값을 계산해 봅시다.

이 값을 계산하기 위해서 mysqld 로그 파일을 분석해야 하는데,
불행히도 시간 기록이 1 초 간격으로 기록되어 있어서 접속이나 close 또는
각 쿼리 시간 통계를 구하기 어렵습니다.
(표본을 하루 단위로 축출하여 계산할 경우, 좀더 정확한 자료가 됨)

따라서, 현재 MySQL 서버의 STATUS 통계 자료를 이용하는 것도 하나의 방법입니다.

  통계를 얻는 방법
  (
      mysql> tee /path/to/mysql.status.txt
      mysql> SHOW STATUS;

      or
      shell> mysqladmin [OPTIONS] extended-status > mysql.status.txt
  )

  주요 MySQL STATUS
  (
      Aborted_clients
      Connections
      Max_used_connections
      Slow_queries
      Questions
      Uptime
      ...
  )

직접적인 평균 wait_timeout 값을 구할 수 없기 때문에,
각 커넥션을 일렬로 늘어놓은 상태의 평균적인 커넥션 life time 값을
구해야 합니다.


2-2. connection life time

'life time' 은 하나의 커넥션이 연결된 후 완전히 close 될 때까지 시간을 말하며,
필자가 자의적으로 붙인 용어입니다.

즉, 여기에서의 life time 은 하나의 커넥션이 살아있는 동안의 시간을 말하며,
이 시간에는 쿼리 실행, connection idle, wait timeout, interactive timeout 등등이
모두 포함되어 있는 time을 말합니다.

  조건
  (
      connection idle ==> wait time out
      interval of connection ==> 0
  )


  가정
  (
      +----------------------------+------------------->+--------->
      |connection                  |               close|connection
      |<-- queries execute time -->|<-- wait timeout -->|
      |<------------- connection life time ------------>|
  )

  life time (하나의 커넥션당 평균)
  (
      = 쿼리 실행 시간(long query 포함)
      += { wait timeout | interactive timeout }
  )


  life time =
  (
      connection
      [ wait time out ]
      [ += 1'th query execute time ]
      [ += wait time out]
      [ += 2'th query execute time ]
      [ += wait time out]
      [ ... ]
      [ += wait time out]
      [ += n'th query execute time ]
      [ += wait time out]
      close
  )


  커넥션 관련 통계
  (
      cps = Connecions / Uptime    ; // 초당 커넥션 수
      spc = Uptime / Connections   ; // 커넥션 주기(초)
      cpq = Question / Connections ; // 커넥션당 요청 쿼리 수
  )

실제 life time 은 mysqld 로그 파일을 분석해봐야 하는데,
이것 역시 상당히 까다롭습니다(exit 시간 기록이 없기 때문).

따라서, 여기에서는 '실제 life time'이 아닌 가상의 '임계 life time'
를 구해서 wait time out 설정에 중요한 자료로 활용하고자 하는 것이
이 문서의 본 내용입니다.


3. 임계 life time

모든 커넥션이 close 되지 않는다는 가정하에서, 즉 모든 커넥션이
한번 접속후 계속적으로 살아있다는 가설을 내리고,
한계 도달 N sec 를 구해서 이에 대한 평균값(AVG)을 구해보면
이 평균값이 커넥션당 '평균 임계 life time'이 됩니다.

바꾸어 말하면,
모든 커넥션들을 꼬리에 꼬리를 무는 가상의 평균적인 일직선으로 만들어
놓고, 한계 도달 N sec 를 구하는 방법입니다
(커넥션과 커넥션 간격을 0으로 봄).

  문제가 되는 경우'
  (
      <FONT FACE='굴림체'>
      동시 접속 connection 수(Y)
      |
      + Max connection ------+------+------
      |                     '|      |
      |                    ' |      |
      |                   '  |      |
      |                 .    |      |
      |               .      |      |
      |             .        |      |
      | . . . . . '          |      |
      |                      |      |
      +----------------------+------+-------> X sec
                             N sec
      </FONT>
      * 시간이 지남에 따라 급격한 기울기(오목한 분포)
  )

  잘 튜닝된 경우
  (
      <FONT FACE='굴림체'>
      동시 접속 connection 수(Y)
      |
      + Max connection ------+------+------
      |                       . ' ' |
      |                     .       |
      |                   '         |
      |                 '           |
      |               .             |
      |             .               |
      | . . . . . '                 |
      |                             |
      +----------------------+------+-------> X sec
                                    N sec
      </FONT>
      * 시간이 지남에 따라 완만한 기울기(볼록한 분포)
  )


  가정
  (
      <FONT FACE='굴림체'>
      동시 접속 connection 수(Y)
      |
      + Max connection -------------+------
      |              |           . '|
      |              |       . '    |
      |              |   . '        |
      |              + '            |
      |          . ' |              |
      |      . '     |              |
      |  . '         |              |
      |              |              |
      +--------------+--------------+-------> X sec
                   (N+1)/2          N sec
      </FONT>
      * 커넥션 간격을 0으로 봄(직선적 기울기)
  )


  한계 도달 N sec 계산법
  (
      1 sec : 1 * cps
      2 sec : 2 * cps
      3 sec : 3 * cps
      ...
      N sec : N * cps => max_connections or Max_used_connections
  )
  or
  (
      N sec : max_connections or Max_used_connections / cps
  )


  최대(최악 상태) 한계 도달 life times 분포와 그 평균값(AVG) 계산법
  (
      1 sec : 1 * cps'th connection : N sec (life time)
      2 sec : 2 * cps'th connection : N - 1 sec
      3 sec : 3 * cps'th connection : N - 2 sec
      ...
      N sec : N * cps'th connection(max) : N - (N -1) sec

      AVG   : (N + 1) / 2 sec (life time) ; // 임계 life time
  )

모든 커넥션이 각각(평균) 이 '임계 life time'와 같거나 더 클 경우
결국 N sec 에 도달해서 full connection 이 된다는 의미입니다.
그 반대로,
커넥션 평균 life time 이 임계 life time 보다 작으면 N sec 이후에서
full connection 이 된다는 결론이 나옵니다.

이것은 mysqld 가 최악의 상태를 말하며, 아주 바쁜 MySQL 서버이거나
아주 바쁜 시간대(rush hour)에 충분히 이런 상황이 될 수 있다는 것을
반증합니다.

이 '임계 life time' 을 구해서 wait_timeout 설정하는데 중요한 자료로
활용하는 것이 본 글의 목적이며, 이 '임계 life time'을 다른 변수값들과
서로 보정하여 최종 wait_timeout 으로 설정하는 내용입니다.


  현재 최대(최악) 예상 임계 life time 계산(EXP)
  (
      N sec = max_connections / cps
            = max_connections * spc
            = max_connections * Uptime / Connections

      임계 life time(EXP)
            = (N + 1) / 2
  )


  현재 평균 임계 life time 계산(CUR)
  (
      N sec = Max_used_connections / cps
            = Max_used_connections * spc
            = Max_used_connections * Uptime / Connections

      임계 life time(CUR)
            = (N + 1) / 2
  )

  지난 과거 최대 임계 life time 계산(PAS)
  (
      N sec = Max_used_connections / maximum of cps
            = Max_used_connections * minimum of spc

      임계 life time(PAS)
            = (N + 1) / 2
  )

  지난 과거 유추 최대 임계 life time 계산(POL)
  (
      N sec = max_connections / maximum of cps
            = max_connections * minimum of spc

      임계 life time(POL)
            = (N + 1) / 2
  )


3-1. 현재 최대(최악) 예상 임계 life time(EXP)

이 값은 MySQL 서버가 시작후 현재까지의 초당 평균 커넥션 수('이하 'cps')
를 기준으로 계산할 때, full connection 인 max_connections 에 도달할 때의
평균 임계 life time 입니다.

즉 모든 커넥션은 각각 절대로 이 EXP 보다 크면 안된다는 의미가 됩니다.
(한계점이므로)

실제로 (wait_timeout > EXP) 경우는 wait_timeout 효과를 기대하기 어렵습니다.

  예를 들어
  (
      wait_timeout = 120
      EXP          =  63
  )

이와 같은 경우가 많은데, 이것을 분석(해석)해 보면,
모든 커넥션의 평균 임계 life time 이 64 초인데 굳이 120 초까지 기다려서
close 하는 경우가 거의 없다는 의미가 됩니다. 물론 평균적인 계산할 때의
얘기입니다.

따라서 최소한 wait_timeout 은 EXP 와 같거나 이 값보다 작게 설정해주는 것이
효과가 있습니다.(크면 별 효과를 기대하기 어려움)


3-2. 현재 평균 임계 life time (CUR)

이 값은 현재까지 최대 동시 접속 커넥션(Max_used_connections)에 도달할 때의
평균 임계 life time 입니다.

즉 life time 이 현재 추세로, 평균적으로 진행할 때의 임계 life time 입니다.

EXP 보다 항상 작거나 같습니다. 서로 같은 경우는 지난 과거에 벌써
full connection 까지 도달했다는 의미가 됩니다.

이 값은 단지 평균적인 현재 추세를 알아보는데 유용합니다.

그런데,

EXP 와 CUR 모두 현재 평균적인 추세에 대한 life time 입니다.
모든 프로그램이 그렇듯이 평균적인 작동원리는 설정은 상당히 위험합니다.
즉 최악의 상태까지 고려해서 프로그램에 임해야 한다는 것입니다.

따라서, EXP와 CUR 값보다 더 작은 임계 life time 을 구해야 하는데,
이것은 지난 과거에 가장 바빴던 cps 로 계산한 POL 해야 합니다.


3-3. 지난 과거 최대 임계 life time (PAS)

지난 과거중에서 최대 cps 값을 선택하여 계산할 때의 임계 life time 입니다.
이 값은 다른 임계 life time 보다 항상 작습니다.

과거중에서 최대 cps 구하는 방법이 조금 까로운데 이것은 매 시간대마다 또는
rush hour 에 체크하여 그 통계의 결과치를 구해야 합니다.

만약 최대 cps 를 구하기 어려우면 현재 평균 cps * (1.5 ~ 2.0) 정도로 계산하면
됩니다.

이 PAS 값은 wait_timeout 값을 구하는데 결정적인 자료로 쓰이며,
CUR 의 보정값이라고 생각하면 됩니다.


3-4. 지난 과거 유추 최대 임계 life time (POL)

EXP 가 현재 평균 cps 값으로 계산한 임계 life time 에 반해서, POL 은 PAS 와
같이 과거중 최대 cps 값으로 계산한 임계 life time 입니다.

즉,
EXP 는 평균적 cps 에 의해서 각 커넥션을 일직선으로 늘어 놓는데 반해서,
POL 은 최대 cps 에 의해서 각 커넥션을 일직선으로 늘어 놓은 상태에서 계산한
life tiem 값입니다.

이 값도 PAS 와 같이 wait_timeout 값을 구하는데 결정적인 자료로 쓰이며,
EXP 의 보정값이라고 생각하면 됩니다.


4. 최종 임계 life time(LPT) 계산(예제)

실제 예를 들어 보겠습니다.

  ex1
  (
      max_connections      = 100
      Max_used_connections =  13
      AVG of cps           = 0.1
      MAX of cps           = 0.3
  ); // 매우 바쁘지 않지만 과거 어느 순간에 극대로 바빴던 경우

  ex2
  (
      max_connections      = 100
      Max_used_connections =  92
      AVG of cps           = 0.8
      MAX of cps           = 1.1
  ); // 비교적 바쁜 서버로써 거의 한계점에 도달하고 있는 경우

  ex3
  (
      max_connections      = 100
      Max_used_connections = 100
      AVG of cps           = 2.4
      MAX of cps           = 2.7
  ); // 아주 바쁜 서버로 과거에 이미 한계점에 초과한 경우

<FONT FACE='굴림체'>
+------+------+------+---------+-----------+-------+-------+
| 구분 |  EXP |  POL |         |  CUR (C%) |  PAS  | (DEF) |
|------+------+------+---------+-----------+-------+-------|
| ex1  |  201 |  167 |         |  66 (33%) |   22  |   44  |
|------+------+------+---------+-----------+-------+-------|
| ex2  |   63 |   46 |         |  58 (92%) |   42  |   16  |
|------+------+------+---------+-----------+-------+-------|
| ex3  |   21 |   19 |         |  21(100%) |   19  |    2  |
+------+------+------+---------+-----------+-------+-------+
</FONT>
* C%  : (CUR * 100 / EXP) ; // 평균 cps 에 대한 임계 도달 사용율
* DEF : CUR - PAS ; // 편차

서버가 바쁠수록 EXP 나 CUR 값이 점점 작아지고, C% 값은 점점 커집니다.

각각 max_connections이 서버의 한계라는 설정에서 EXP 나 CUR 값이 10 보다
작으면 서버의 증설이 필요하다는 것을 의미합니다.
(slow query 10 sec 에 기준을 둔다면)

여기에서 중요한 임계 life time 은 PAS 값인데,
이 PAS 값은 제일 바쁜 상태가 계속된다는 가정이므로 다른 값보다 항상
제일 작습니다.

실제 위의 예를 보면,
ex1이 ex2 보다 평균적으로 더 바쁘지 않지만 PAS 값이 더 작습니다.
이 의미는 과거의 어느 순간에 ex2 보다 더 바빴다는 증거이고 앞으로
그럴 가능성이 있다는 의미입니다.

DEF 값이 크다는 의미는 평균과 최대치의 life time 의 차가 크다는 의미로
서버가 바쁠때와 그렇지 않을때의 차가 크다는 의미입니다.

또한 PAS 값이 10 보다 작으면 서버 증설 필요성이 상당히 높다는 의미가
됩니다. (slow query 10 sec 에 기준을 둔다면)

EXP, POL, CUR, PAS 중에서 튜닝할 임계 life time 값을 선택해야 하는데,
POL 이나 PAS 값 중에서 하나를 선택하면 됩니다.

POL 값을 선택할 경우는 매우 관대한 정책(설정)이 될 것이고, PAS 값을
선택하면 매우 제한적인 설정이 됩니다.

주의할 점은 선택한 임계 life time 이 10 보다 작으면 서버가 아주 바쁜
상태에 목표를 두고 튜닝해야 하므로 주의해야 합니다.

여기에서는 편의상 PAS 값을 선택하겠습니다.

그런데 ex1 같은 경우는 DEF 편차가 상당히 큰데, ex1 비교적 그리 바쁘지
않으므로 그 다음으로 작은 CUR 값을 선택하는 것이 좋습니다.

만약 서버가 전체적으로 비교적 바쁘다고 생각하면 제일 작은 PAS 값을
선택하면 됩니다.

<FONT FACE='굴림체'>
+------+----------------------------------+
| 구분 |  최종 임계 life time (LPT)       |
|------+----------------------------------|
| ex1  |            66                    |
|------+----------------------------------|
| ex2  |            42                    | 
|------+----------------------------------|
| ex3  |            19                    |
+------+----------------------------------+
</FONT>


5. wait_timeout 계산 및 보정

이제 life time 이 결정되었으니 wait_timeout 값을 설정해 봅시다.

앞서 얘기했듯이 life time 은 각 커넥션을 평균적으로 일직선상에
놓았을 경우, 한계 도달 시간을 의미합니다.

즉 각 커넥션은 평균적으로 이 life time 값을 넘어서면 안된다는 의미
입니다. (max_connections 값이 이미 정해진 한계이기 때문에)

LPT 값이 19 이라면(ex3의 경우),

  cpq = 8(예)
  (
      Questions / Connections
  ); // 커넥션당 평균 쿼리 요청수

  LPT =
  (
      (connection)
      (
          [ = wait time out]
          [ += 1'th query execute time ]
      )
      (
          [ += wait time out]
          [ += 2'th query execute time ]
      )
      (
          [ ... ]
      )
      (
          [ += wait time out]
          [ += n'th query execute time ] ; // n => cpq
          [ += wait time out]
      )
      (close)
  ) < 19

이런 조건식이 나옵니다.

그리고
하나의 쿼리가 실행한 시간과 그 다음 쿼리까지의 시간을 평균적으로
계산하면 다음과 같습니다.
  
  2.4 sec = 19 / 8 = LPT / cpq

보통 하나의 쿼리가 실행하는 시간은 상당히 짧은 0.001 ~ 2.0 sec 정도
되는 것이 보통입니다.(물론 예외도 있음)

그러면 대충 wait time out 값을 계산 또는 짐착할 수 있습니다.
즉 평균적으로 2.4 초 보다 항상 작다는 결론이 나옵니다.

그러나

이 값을 곧바로 wait_timeout 값으로 설정하면 상당히 위험합니다.
이 값은 어디까지나 평균적인 수치일 뿐 편차에 대한 고려가 전혀 없습니다.

예를 들어, 각 커넥션마다 쿼리가 하나이면 상관은 없지만,
다음과 같은 경우가 상당히 많기 때문입니다.

  life time
  (
      connection
      (
          = wait time out                 ; // 0.1 sec
          = 1'th query execute time       ; // 0.4 sec
      )
      (실제 쿼리에 상관없는 작업 시간 = 3.1 sec)
      (
          += wait time out                ; // 3.1 sec > 2.4 sec
          += 2'th query execute time      ; // 0.2 sec
      )
      close
  ) < 19 ; // 예제

따라서 앞에서 계산한 2.4 sec 는 실제로 wait_timeout 에 적용하기에는
매우 적절하지 않습니다.

결론적으로

하나의 커넥션이 최소한 하나 이상의 쿼리가 있는 경우가 거의 대부분이므로
이 점을 고려서 계산하면 다름과 같은 최종적인 계산식이 나옵니다.

  wait_timeout
  (
      = LPT - (LPT / cpq)
      = LPT - (LPT * Connections / Questions)
  )
  * 단) LPT > 10
  * 단) cpq > 1
  * 단) wait_timeout > 10 (한계값, slow query 고려)


<FONT FACE='굴림체'>
+------+-------+----------+--------------------+---------+
| 구분 |  LPT  |  cpq(예) |    wait_timeout    |   AVG   |
|------+-------+----------+--------------------+---------|
| ex1  |   66  |     5    |         53         |    59   |
|------+-------+----------+--------------------+---------|
| ex2  |   42  |     7    |         36         |    39   |
|------+-------+----------+--------------------+---------|
| ex3  |   19  |     9    |         17         |    18   |
+------+-------+----------+--------------------+---------+
</FONT>

이 wait_timeout 은 상당히 제한적인 정책입니다.
좀더 관대한 설정을 원한다면 LPT 값을 wait_timeout 값으로 설정하거나
LPT와 계산한 wait_timeout 과 평균값(AVG)을 최종 wait_timeout 값으로
설정하면 됩니다.


6. 결과 확인

이제 최종적으로 wait_timeout 값이 정해졌므로 이 값을 서버에 적용해
봅니다.

  적용 예
  (
      shell> safe_mysqld ... -O wait_timeout=17 &

      or

      [mysqld]
      ...
      set-variable    = wait_timeout=17
  )


튜닝전에 비해서 연결 취소율(POC)이 더 올라가야 정상입니다.
이 의미는 비정상적인 커넥션을 반환하는 비율이므로, 성공적인
튜닝이라고 할 수 있습니다.



7. 후기

헙... 어디에서 쇠(?) 타는 냄새가 난다했더니....
CPU 팬이 안도네요(설마 설마 했더니)....T.T
그것도 AMD CPU ....
제가 냄새에 민감해서 천만다행..



EOF
 

'DB' 카테고리의 다른 글

mysql-성능튜닝 #2  (0) 2008.05.23
mysql- 성능 튜닝 #1  (0) 2008.05.23
mysql&gt; show variables  (0) 2008.05.23
mysql 기본 설정 보기  (2) 2008.05.23
mysql 5.0의 사용자 관리 페이지  (0) 2008.04.25
Posted by '김용환'
,

mysql&gt; show variables

DB 2008. 5. 23. 00:56

 

mysql> show variables
    -> ;
+---------------------------------+----------------------------------------+
| Variable_name                   | Value                                  |
+---------------------------------+----------------------------------------+
| back_log                        | 50                                     |
| basedir                         | /usr/local/mysql/                      |
| binlog_cache_size               | 32768                                  |
| bulk_insert_buffer_size         | 8388608                                |
| character_set_client            | euckr                                  |
| character_set_connection        | euckr                                  |
| character_set_database          | euckr                                  |
| character_set_results           | euckr                                  |
| character_set_server            | euckr                                  |
| character_set_system            | utf8                                   |
| character_sets_dir              | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection            | euckr_korean_ci                        |
| collation_database              | euckr_korean_ci                        |
| collation_server                | euckr_korean_ci                        |
| concurrent_insert               | ON                                     |
| connect_timeout                 | 5                                      |
| datadir                         | /usr/local/mysql/var/                  |
| date_format                     | %Y-%m-%d                               |
| datetime_format                 | %Y-%m-%d %H:%i:%s                      |
| default_week_format             | 0                                      |
| delay_key_write                 | ON                                     |
| delayed_insert_limit            | 100                                    |
| delayed_insert_timeout          | 300                                    |
| delayed_queue_size              | 1000                                   |
| expire_logs_days                | 0                                      |
| flush                           | OFF                                    |
| flush_time                      | 0                                      |
| ft_boolean_syntax               | + -><()~*:""&|                         |
| ft_max_word_len                 | 84                                     |
| ft_min_word_len                 | 4                                      |
| ft_query_expansion_limit        | 20                                     |
| ft_stopword_file                | (built-in)                             |
| group_concat_max_len            | 1024                                   |
| have_archive                    | NO                                     |
| have_bdb                        | NO                                     |
| have_compress                   | YES                                    |
| have_crypt                      | YES                                    |
| have_csv                        | NO                                     |
| have_example_engine             | NO                                     |
| have_geometry                   | YES                                    |
| have_innodb                     | YES                                    |
| have_isam                       | NO                                     |
| have_ndbcluster                 | NO                                     |
| have_openssl                    | NO                                     |
| have_query_cache                | YES                                    |
| have_raid                       | NO                                     |
| have_rtree_keys                 | YES                                    |
| have_symlink                    | YES                                    |
| init_connect                    |                                        |
| init_file                       |                                        |
| init_slave                      |                                        |
| innodb_additional_mem_pool_size | 1048576                                |
| innodb_autoextend_increment     | 8                                      |
| innodb_buffer_pool_awe_mem_mb   | 0                                      |
| innodb_buffer_pool_size         | 8388608                                |
| innodb_data_file_path           | ibdata1:10M:autoextend                 |
| innodb_data_home_dir            |                                        |
| innodb_fast_shutdown            | ON                                     |
| innodb_file_io_threads          | 4                                      |
| innodb_file_per_table           | OFF                                    |
| innodb_flush_log_at_trx_commit  | 1                                      |
| innodb_flush_method             |                                        |
| innodb_force_recovery           | 0                                      |
| innodb_lock_wait_timeout        | 50                                     |
| innodb_locks_unsafe_for_binlog  | OFF                                    |
| innodb_log_arch_dir             |                                        |
| innodb_log_archive              | OFF                                    |
| innodb_log_buffer_size          | 1048576                                |
| innodb_log_file_size            | 5242880                                |
| innodb_log_files_in_group       | 2                                      |
| innodb_log_group_home_dir       | ./                                     |
| innodb_max_dirty_pages_pct      | 90                                     |
| innodb_max_purge_lag            | 0                                      |
| innodb_mirrored_log_groups      | 1                                      |
| innodb_open_files               | 300                                    |
| innodb_table_locks              | ON                                     |
| innodb_thread_concurrency       | 8                                      |
| interactive_timeout             | 28800                                  |
| join_buffer_size                | 131072                                 |
| key_buffer_size                 | 402653184                              |
| key_cache_age_threshold         | 300                                    |
| key_cache_block_size            | 1024                                   |
| key_cache_division_limit        | 100                                    |
| language                        | /usr/local/mysql/share/mysql/english/  |
| large_files_support             | ON                                     |
| license                         | GPL                                    |
| local_infile                    | ON                                     |
| locked_in_memory                | OFF                                    |
| log                             | OFF                                    |
| log_bin                         | ON                                     |
| log_error                       |                                        |
| log_slave_updates               | OFF                                    |
| log_slow_queries                | ON                                     |
| log_update                      | OFF                                    |
| log_warnings                    | 1                                      |
| long_query_time                 | 5                                      |
| low_priority_updates            | OFF                                    |
| lower_case_file_system          | OFF                                    |
| lower_case_table_names          | 0                                      |
| max_allowed_packet              | 10484736                               |
| max_binlog_cache_size           | 4294967295                             |
| max_binlog_size                 | 1073741824                             |
| max_connect_errors              | 99999999                               |
| max_connections                 | 1000                                   |
| max_delayed_threads             | 20                                     |
| max_error_count                 | 64                                     |
| max_heap_table_size             | 16777216                               |
| max_insert_delayed_threads      | 20                                     |
| max_join_size                   | 4294967295                             |
| max_length_for_sort_data        | 1024                                   |
| max_relay_log_size              | 0                                      |
| max_seeks_for_key               | 4294967295                             |
| max_sort_length                 | 1024                                   |
| max_tmp_tables                  | 32                                     |
| max_user_connections            | 0                                      |
| max_write_lock_count            | 4294967295                             |
| myisam_data_pointer_size        | 4                                      |
| myisam_max_extra_sort_file_size | 2147483648                             |
| myisam_max_sort_file_size       | 2147483647                             |
| myisam_recover_options          | OFF                                    |
| myisam_repair_threads           | 1                                      |
| myisam_sort_buffer_size         | 67108864                               |
| net_buffer_length               | 16384                                  |
| net_read_timeout                | 30                                     |
| net_retry_count                 | 10                                     |
| net_write_timeout               | 60                                     |
| new                             | OFF                                    |
| old_passwords                   | OFF                                    |
| open_files_limit                | 16000                                  |
| pid_file                        | /usr/local/mysql/var/sky279.pid        |
| port                            | 3308                                   |
| preload_buffer_size             | 32768                                  |
| protocol_version                | 10                                     |
| query_alloc_block_size          | 8192                                   |
| query_cache_limit               | 1048576                                |
| query_cache_min_res_unit        | 4096                                   |
| query_cache_size                | 0                                      |
| query_cache_type                | ON                                     |
| query_cache_wlock_invalidate    | OFF                                    |
| query_prealloc_size             | 8192                                   |
| range_alloc_block_size          | 2048                                   |
| read_buffer_size                | 520192                                 |
| read_only                       | OFF                                    |
| read_rnd_buffer_size            | 262144                                 |
| relay_log_purge                 | ON                                     |
| rpl_recovery_rank               | 0                                      |
| secure_auth                     | OFF                                    |
| server_id                       | 2                                      |
| skip_external_locking           | ON                                     |
| skip_networking                 | OFF                                    |
| skip_show_database              | OFF                                    |
| slave_net_timeout               | 3600                                   |
| slow_launch_time                | 2                                      |
| socket                          | /tmp/mysql.sock                        |
| sort_buffer_size                | 524280                                 |
| sql_mode                        |                                        |
| storage_engine                  | MyISAM                                 |
| sync_binlog                     | 0                                      |
| sync_replication                | 0                                      |
| sync_replication_slave_id       | 0                                      |
| sync_replication_timeout        | 0                                      |
| sync_frm                        | ON                                     |
| system_time_zone                | KST                                    |
| table_cache                     | 512                                    |
| table_type                      | MyISAM                                 |
| thread_cache_size               | 4                                      |
| thread_stack                    | 196608                                 |
| time_format                     | %H:%i:%s                               |
| time_zone                       | SYSTEM                                 |
| tmp_table_size                  | 33554432                               |
| tmpdir                          |                                        |
| transaction_alloc_block_size    | 8192                                   |
| transaction_prealloc_size       | 4096                                   |
| tx_isolation                    | REPEATABLE-READ                        |
| version                         | 4.1.10-log                             |
| version_comment                 | Source distribution                    |
| version_compile_machine         | i686                                   |
| version_compile_os              | pc-linux-gnu                           |
| wait_timeout                    | 28800                                  |
+---------------------------------+----------------------------------------+

 

 

 

 

/etc/my.cnf 파일에 wait_timeout을 1800000 값을 주고 다시 뛰우니. 다음과 같이 값을 얻어올 수 있었다.


mysql> select @@global.wait_timeout
    -> ;
+-----------------------+
| @@global.wait_timeout |
+-----------------------+
|               1800000 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select @@session.wait_timeout
    -> ;
+------------------------+
| @@session.wait_timeout |
+------------------------+
|                  28800 |
+------------------------+
1 row in set (0.00 sec)

 

 

 

'DB' 카테고리의 다른 글

mysql- 성능 튜닝 #1  (0) 2008.05.23
mysql 의 wait_timeout의 의미  (0) 2008.05.23
mysql 기본 설정 보기  (2) 2008.05.23
mysql 5.0의 사용자 관리 페이지  (0) 2008.04.25
mysql에서 row를 세로로 보기  (0) 2008.04.25
Posted by '김용환'
,

mysql 기본 설정 보기

DB 2008. 5. 23. 00:52

mysql 기본 디폴트 설정 보기.

 

 

/usr/local/mysql/bin/mysql --no-defaults --help

 

/etc/my.cnf /usr/local/mysql/var/my.cnf ~/.my.cnf
The following groups are read: mysql client
The following options may be given as the first argument:
--print-defaults        Print the program argument list and exit
--no-defaults           Don't read default options from any options file
--defaults-file=#       Only read default options from the given file #
--defaults-extra-file=# Read this file after the global files are read

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- -----------------------------
auto-rehash                       TRUE
character-sets-dir                (No default value)
default-character-set             euckr
compress                          FALSE
database                          (No default value)
delimiter                         ;
vertical                          FALSE
force                             FALSE
named-commands                    FALSE
local-infile                      FALSE
no-beep                           FALSE
host                              (No default value)
html                              FALSE
xml                               FALSE
line-numbers                      TRUE
unbuffered                        FALSE
column-names                      TRUE
sigint-ignore                     FALSE
port                              3306
prompt                            mysql>
quick                             FALSE
raw                               FALSE
reconnect                         TRUE
socket                            (No default value)
table                             FALSE
debug-info                        FALSE
user                              (No default value)
safe-updates                      FALSE
i-am-a-dummy                      FALSE
connect_timeout                   0
max_allowed_packet                16777216
net_buffer_length                 16384
select_limit                      1000
max_join_size                     1000000
secure-auth                       FALSE

 

 

 

'DB' 카테고리의 다른 글

mysql 의 wait_timeout의 의미  (0) 2008.05.23
mysql&gt; show variables  (0) 2008.05.23
mysql 5.0의 사용자 관리 페이지  (0) 2008.04.25
mysql에서 row를 세로로 보기  (0) 2008.04.25
Toad 단축키.  (0) 2008.04.19
Posted by '김용환'
,

java개발자라면, 반드시 봐야할 내용들이다.

java.sun.com에는 모든 것이 있다. 이클립스 플러그인 보다는 훨씬 더 많고 풍부한 자료들이 있는 java.sun.com을 추천한다.

 

버젼과는 상관없이 봐야하는 것은 다음과 같다.

Release note, java utitily, 튜닝 팁, tutotial.

 

 

예)

 

Java 1.5

http://java.sun.com/j2se/1.5.0/docs/index.html

 

java utility

http://java.sun.com/j2se/1.5.0/docs/tooldocs/index.html

 

성능 튜닝 및 해결 가이드 및 팁

http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf

 

Release Note

http://java.sun.com/j2se/1.5.0/relnotes.html

Posted by '김용환'
,