24. ファイルI/Oと同期書き込み (1) ストレージを有効に使う RAID コントローラに「バッテリーバックアップつきライトキャッシュ」を搭載し、 書き込み性能を上げる ドライブ自身のキャッシュは無効にすること disk Write cache disk seek & rotation time seek & rotation time
36. Thread 1 (LWP 15380) が毎回同じところで止まっていた pthread_create() から呼ばれる clone() システムコールが怪しい とりあえず、これを MySQL に呼ばせないような処理をさせよう ..... Thread 3 (Thread 0x46c1d950 (LWP 28494)): #0 0x00007ffda5474384 in __lll_lock_wait () from /lib/libpthread.so.0 #1 0x00007ffda546fc5c in _L_lock_1054 () from /lib/libpthread.so.0 #2 0x00007ffda546fb30 in pthread_mutex_lock () from /lib/libpthread.so.0 #3 0x0000000000a0f67d in my_pthread_fastmutex_lock (mp=0xf46d30) at thr_mutex.c:487 #4 0x000000000060cbe4 in dispatch_command (command=16018736, thd=0x80, packet=0x65 <Address 0x65 out of bounds>, packet_length=4294967295) at sql_parse.cc:969 #5 0x000000000060cb56 in do_command (thd=0xf46d30) at sql_parse.cc:854 #6 0x0000000000607f0c in handle_one_connection (arg=0xf46d30) at sql_connect.cc:1127 #7 0x00007ffda546dfc7 in start_thread () from /lib/libpthread.so.0 #8 0x00007ffda46305ad in clone () from /lib/libc.so.6 #9 0x0000000000000000 in ?? () Thread 1 (Thread 0x7ffda58936e0 ( LWP 15380 )): #0 0x00007ffda4630571 in clone () from /lib/libc.so.6 #1 0x00007ffda546d396 in do_clone () from /lib/libpthread.so.0 #2 0x00007ffda546db48 in pthread_create@@GLIBC_2.2.5 () from /lib/libpthread.so.0 #3 0x0000000000600a66 in create_thread_to_handle_connection (thd=0x3d0f00) at mysqld.cc:4811 #4 0x00000000005ff65a in handle_connections_sockets (arg=0x3d0f00) at mysqld.cc:5134 #5 0x00000000005fe6fd in main (argc=4001536, argv=0x4578c260) at mysqld.cc:4471 #0 0x00007ffda4630571 in clone () from /lib/libc.so.6
37. SystemTap Solaris の DTrace に匹敵する 高機能なプロファイリング機能を提供 DWARF デバッグシンボルのあるプログラムなら、 ユーザー関数のプロファイリングも可能 MySQL 標準バイナリで使える 監視対象プロセスがクラッシュしたという報告が随所にある
38. ケーススタディ MySQL が内部で行うソートアルゴリズムには 2 種類ある 旧型方式: ソート対象列と行 ID だけをソートバッファに 読み込んでソートして、その後に行 ID から残りの列を取りに行く 新型方式: アクセス対象列全部をソートバッファに 読み込んでソートして、それを返す LIMIT 句を使う場合など、結構な性能差が出る場合もあるので、 どちらが使われるかは重要 現在の MySQL の統計情報からは、どちらの アルゴリズムが実際に使用されたのかを確認する方法は無い 返されるレコード 1 個につき、旧型ソートでは rr_from_pointers() 、 新型ソートでは rr_unpack_from_buffer() が呼ばれることを知っていれば、 それぞれが何回呼ばれるかを数える System Tap スクリプトを書けば良い mysql> EXPLAIN SELECT user_id, post_date, title -> FROM diary ORDER BY rating DESC limit 100 ********* select_type: SIMPLE table: diary type: ALL key: NULL rows: 1163 Extra: Using filesort post_date 2010-03-29 2010-03-30 2010-03-31 2010-04-01 user_id 100 2 3 10 rating 4.71 3.32 4.10 4.50 title UEFA CL: Inter vs Chelsea Denmark vs Japan, 3-0 MySQL Administration Linux tuning post_date 2009-03-29 2009-03-30 2009-03-31 2009-04-01 user_id 100 2 3 10 rating 4.71 3.32 4.10 4.50 title UEFA CL: Inter vs Chelsea Denmark vs Japan, 3-0 MySQL Administration Linux tuning 1) Load into sort buffer 3) Fetch the rest columns 2) Sort 1) Load all columns into sort buffer 旧型方式 新型方式 rating 4.71 3.32 4.10 4.50 RowID 1 2 3 4 2) Sort rating 4.71 4.50 4.10 3.32 RowID 1 4 3 3
39. SystemTap を使う global oldsort=0; global newsort=0; probe process("/usr/local/bin/mysqld").function("*rr_from_pointers*").return { oldsort++; } probe process("/usr/local/bin/mysqld").function("*rr_unpack_from_buffer*").return { newsort++; } probe end { printf("# of returned rows sorted by old algorithm: %d ", oldsort); printf("# of returned rows sorted by new algorithm: %d ", newsort); } ----- [root #] stap sort.stp # of returned rows sorted by old algorithm: 0 # of returned rows sorted by new algorithm: 100
40. ネットワークとデータベース接続 ディスク I/O よりずっと速いので、ディスク I/O ネックの場合はどちらでも大差無い パーシステント・コネクションの方が効率的 エラー発生時に、その影響を後続のコネクションに 引き継がないように細心の注意が必要 プリペアードステートメントキャッシュの利用も検討したい 通常のコネクションの場合には、余計な初期化 / 終了処理を可能な限り減らす skip-name-resolve によって DNS サーバへのルックアップを無くす thread-cache-size を max-connections と同じ値にして、 pthread_create() を呼ばさせない 接続時に操作対象のデータベース名を指定して、ドライバに USE 文を実行させない ( できるドライバとできないドライバがある ) skip-client-character-set-handshake によって、ドライバに SET NAMES 文を実行させない Persistent Connection/ Connection Pool Non-Persistent Connection Connect USE db SET NAMES utf8 SQL statement Disconnect SQL statement - Establish TCP/IP conn - Name Resolve to DNS - pthread_create() (Rollback) Web/App Server DB Server Web/App Server DB Server