MTエンジニアブログ
onagatani
2011年08月20日
開発者向けチューニング編
宣伝 MYSQL徹底入門5.5
ディスクIO性能を常に意識する
HDDのランダムアクセス性能・・・5msとか
できるだけディスクアクセスをなくす
datetime型でなくtimestumpにするとか(容量が減る)
一部のクエリだけが問題をおこしたり
1%のクエリで全体の99%のリソースを消費したり
・大量のレコードスキャン
・個々の実行は早いが大量回数の実行
・スローログにでないので注意
長時間のロックを保持
他のものがまたされる
LockWaitTimeoutとか
調査
tcpdumpとmk-query-digest便利
基本的な所でexplain
オプティマイザが判断を誤る事もある。。
・特にソート
・・force indexでコントロール
・基本的には大丈夫ですが。
スレーブの性質
スレーブはシングルスレッド
低スペックだとレプリ遅延を招く
テンポラリテーブルとの相性
5.1の行ベースバイナリログを検討
トランザクションを意識
BEGINからCOMMITまたはROLLBACKまでが1つのトランザクション
トランザクションの対象は同一サーバないのInnoDBのみ
XAは安定していない
トランザクション中にInnoDB更新、MyISAM更新、memcachedとかやってもInnoDBのみ
myslowtrancaptureで遅いトランザクションを特定する
- 実行に一定時間以上かかったトランザクションを特定
- githubにあります!
最後に応答を受け取ってからcommitするまでロックは開放されない
データサイズに気を配る
必要以上に大きなデータ型を使うべきでない
DATETIMEよりTIMESTAMP
vacharよりint
intよりsmallint
長い文字列はアプリ側で圧縮も検討
範囲検索は注意
ーーーこまかい所のメモが難しいので中略ーーー
Insert性能とメモリ量の関係
インサートすると、、、
・リーフがいっぱいだと新しいリーフを作成
・日付のインサートは昇順
・通常はインデックスの並び順に対してレコードはランダムに入る
ランダムIndertはdisk readになる
・インデックス内のエントリを更新するにはそのブロックをメモリバッファ内に収める必要がある
インデックスサイズに注意
・インデックスサイズがメモリに収まればいいけど、そうでない場合は時間がかかる
インメモリインサートでは
・秒間10000r/s
・バッファプール超えた場合
2000-4000r/s
=> Insertをインメモリで行なうためにインデックスサイズを小さくする
時系列データはレンジパーティション
sharding
・5,1のレンジパーティーション
全体のデータのところどころにアクセスするたためには大きなメモリが必要
ブロックを限定してアクセスするような仕組みが必要
covering indexで対処可能
ここが参考になりそう
やっていはいけない事色々
・select * は多用しない(必要な列だけ)
・省スペース化 シリアライズを適当にやったりとか。圧縮できるよね
・TEXT,BLOBを使わない varcharを使うとか
Explainを見る
・UsingIndexでないクエリは使用禁止
・巨大なlimitを注意
・left outer joinを使わない(必要ないデータは返さない)
・ストレージエンジンを混在させない
・InnoDBとMyISAMをjoinしたりしない
・同一サーバないでは同じストレージエンジン
・キューサーバとしてQ4Mを独立させたりはあり
・重複したインデックスを持たない
・ index(c1) index(c1,c2)みたいな
・LOAD DATAは使わない
・注意事項色々・・・
・バルクインサートとかで対応
と色々書きましたが、書くのが間に合っていない内容が多々あります。すいません
onagatani
2011年08月20日
メモですがとりあえず晒します
*あくまでもメモなのでおかしな文言・間違っている内容があるかも。書くのが間に合わなかった内容もあります。あしからず
MHAについて
単一障害点をなくしたい
DENAではサーバ台数が1000台・・
MYSQLではスレーブは複数だが、マスターが1つなのでシングルポイントになってしまう。
マスターが障害を起こしたときに、全ての情報が全てのslaveにバイナリログを渡していない可能性がある。
正しく復旧するには、マスターのバイナリログの最終更新を拾い出し、slave間の差分をなくす必要がある。
MHAは。。。
Managerサーバが全てのMYSQLサーバをチェック(pingするだけ)。
マスターの稼働監視から自動フェイルオーバーまでを行なうツール。PurePerl。
秒単位でできる(アクティブ・アクティブ型なので)。
任意のスレーブを新マスターにできる
外部スクリプトを呼ぶ拡張ポイントがある
- 複数の経路(NW)から本当にマスターが死んだか検証
- 強制電源OFF
- マスターIPアドレスの更新
MYSQL5.0以降で動作
導入にはプロセスの停止は必要ない
パフォーマンス劣化はない
ストレージエンジンに依存しない
--- 中略(電話に出てる間に話がわからなくなる)---
デモ
--- 中略(電話に出てる間に話がわからなくなる)---
任意のスレーブをマスターにできる
準同期レプリを使うとほぼデータのロストがない
マスターを他のサーバに移したい事はよくある。
ダウンタイムなしでマスター切り替えがしたい。
マスターの更新を止める、スレーブの同期をまつ
それらを0.5秒くらいでできればいいかも
書き込みのブロックは?
MYSQLの更新ブロックは全てが安全ではない
アプリケーションから使っているユーザをdrop
新規セッションがはれないくなる
接続済みのセッションは切断までエラーにならず
=>この話はOSCでも聞いたんですが、非常に納得しました
MHAだと手動でマスターを切り替える機能がある!!!
QA
MHA Managerがおちたらどうする?
ManagerをHertBeatしてpeacemakerとか。
方川
2011年08月08日
アイテムのアップロード画面から、複数のファイルを一括でアップロードできるようにするMovable Typeプラグインを公開します。このプラグインを利用することで、アイテムを複数選択して一括でアップロードできるようになります。また画像の一括リサイズやアップロード幅の上限を決めて自動的にリサイズさせることも出来ますので、デジカメなどで撮った大きな写真をアップロードさせることを防ぐことが出来ます。

インストール
解凍して出来るpluginsディレクトリとmt-staticディレクトリをそのままMTの各ディレクトリに上書きしてください。
使い方

プラグインを導入すると、ウェブサイト/ブログのアイテムメニューの「新規」がMultiFileUploaderと置き換わります。ここで、参照をクリックしてファイルを複数選択してアップロードボタンを押すだけです。「ファイルを選択→アップロード→ファイルを選択→アップロード...」と何度も繰り返さなくても、複数のファイルを一括アップロードできるわけですね。アップロードと同時に、画像ファイルをリサイズしたり、タグを設定することができます。
新機能
-
各ウェブサイト・ブログのプラグイン設定画面から、画像のリサイズ時のサイズを標準で設定できるようになりました。固定値にして強制させることも可能です。
-
MT既存のアップロードのリンク「アイテム > 新規」や一覧の画面の「アイテムの作成」を複数ファイルのアップロード機能に置き換えます。後方互換として置き換えない場合のモードをシステムのプラグイン設定で切り替えることが可能です。
不具合修正・セキュリティ対応
ダウンロード
ダウンロード - バージョン0.45
その他
-
このプラグインはブログウェアです。どなたでも無償でご利用頂けますが、感想、要望などをあなたのブログで記事として紹介頂けると幸いです。
-
本プラグインをご利用される方は必ずプラグインご利用の際の注意事項をお読みください。
-
MT5.0で動作します(MT5.1には対応しておりません)
小林
2011年07月27日
こんにちわ、小林です。
こっちのブログに顔を出すのは久々なのですが、関東圏外のPerlエンジニアの方に朗報です。JPAさんが関東圏外のエンジニアの方がYAPC::Asiaに参加しやすくする制度「遠方からの参加者支援制度」の申し込みを開始しました。
YAPC::Asia 2011 「遠方からの参加者支援制度」申し込み者募集のお知らせ
この制度は以下の条件を満たせば、各地域からの交通費を全額負担するという新しい試みです。
-
感想などのBlogエントリを書く
-
地域LT枠でのトーク
-
YAPCに参加したい!という熱い気持ち
スカイアークのエンジニアはすべて北海道在住なのですが、社内ではYAPCにいかせろ!というプレッシャーが強く(笑)、昨年技術支援予算というもので自由に東京に出入り出来る制度を作って、関東圏のセミナーなどに参加しやすくしています。
北海道のエンジニアにいろいろ話を聞いていると、なかなか交通費の関係で関東圏に行きづらいという話をよく耳にしていたので、何かできないかなぁと思っていました。あと@onagataniの「もっとYAPCに行きやすく出来ないか!」という熱い想いもあり、今回JPAさんの「遠方からの参加者支援制度」に協賛いたしました。
この協賛を通じて北海道はもちろん、それ以外の各地域のPerl振興に少しでも力が貸せればと思ってます。
あ、もちろん弊社のエンジニアは会社の技術支援予算で参加しますので枠が狭まることは御座いません、ご安心くださいw
それではみなさん、ふるってご応募・ご参加ください−!
谷内
2011年07月20日
谷内@帯広です。
7月16日土曜日、Hokkaido.pm に参加してきました。
Hokkaido.pm では毎回、さらに今年は OSC、昨年は YAPC::Asia にも参戦して発表をしてきましたが、LT(Lightning Talk)形式は初めてでした。
LTは5分間という枠内で、技術的な内容に加えて「ウケ」が重視した発表が求められます。
またトリを務める上に、体調も思わしくなく緊張しました。
お題は「Perl meets 次世代ゲームコンソール」です。
CUI上で ASCIIアートではなく、スプライトを使ったグラフィカルなゲームを作るという内容です。
上の動画の3分52秒あたりで「マ○オ」もどきが動くデモが見られます。
利用している技術は以下です。
- イベントループ ... AnyEvent
- リアルタイムキースキャン ... Term::TermKey、AnyEvent::TermKey
- サウンド ... Audio::Beep
- グラフィック ... Curses
- スプライトクラス ... Mouse、Data::Section::Simple
ポイントは以下です。
- AnyEvent(AE::timer) で、毎秒30フレームとなるように画面更新を行う
use AnyEvent;
my $t = AE::timer 0, 0.033, sub { "Curses の erase/addstr/refresh 処理など" };
my $cv = AE::cv;
$cv->recv;
AnyEvent::TermKey で、非同期にキー入力を待ち受ける
use AnyEvent::TermKey;
my $kw = AnyEvent::TermKey->new({
term => ¥*STDIN,
on_key => sub {
my ($key) = @_;
if ($key->utf8 eq 'h') { "移動処理"; }
},
});
Curses を使って色と座標を指定し、ターミナル画面上にドットを出力する
Mouse を利用して、汎用的なスプライトクラスを作成する
Data::Section::Simple で、スプライトとして出力するビットマップデータを読み取る
Microsoft Excel で、キャラクタパターンのモデリングを行う
これはあくまでもネタですので、このまま大きなゲームを作成すると破綻すると思います。
また、衝突判定などもいちいち自力で書かないといけません。
この辺の課題は、今後 Games::CUI という汎用的なゲーム作成ライブラリを開発してクリアしようと考えています。
モノになったらエンジニアブログにて、サンプルゲームととも公開しますので、お楽しみに!