MySQL の Out of memoryで悩む

mysql で、最近たまにエラーログに以下のような Out of memory が出ていた。
サーバは、メモリーを 6G 積んでるので Out of memory ってのが
そんなに簡単にでるとは思ってなかったので困惑してしまった。
(半年前までは、1G で、増強したばっかりだったので。。。)

今回の環境
MySQL-server-5.0.51a-tritonn.1.0.9
CentOS5.2

すべてのクエリーに対して出ているわけではなく、たまに出るって感じ。
毎秒100件程度のクエリーに対して、1日で10〜20件程度、時間帯も混んでる時間帯のような気がするが
それほどでもないときもたまに出ていた。

081106 12:12:05 [ERROR] /usr/sbin/mysqld: Out of memory (Needed 2091016 bytes)

いろいろ調べてみたのだが、これといってぴったりの情報もなし。
海外のコミュニティーで同様の質問している人は見つけたけど、
読み進めても、英語なもんでどういう風に話が進んだのか詳細はわからず。
http://forum.mysqlperformanceblog.com/s/mv/tree/577/

クライアント側でメモリーがたらないかもとか、mysql の本家にはあったけど
どうもそういうわけではない。。。
http://dev.mysql.com/doc/refman/5.1/ja/out-of-memory.html

MySqlユーザMLのほうで、スレッドごとにメモリを消費する、sort_buffer_size あたりを
小さくすれば解決したらしい内容があったので試してみる
(ちょっと内容は古いし、バージョンも異なるけど)
http://www.mysql.gr.jp/mysqlml/mysql/msg/14193

myisam_sort_buffer_size=64M  <- 128M
sort_buffer_size=2M  <- 8M

とりあえずは、エラーログはでなくなったんだけど、
これでよかったのかな。何か間違った解決をした気がしてならない。
(行き当たりばったりだな、ホンと)

スレッドで使用するメモリー量 × 同時接続スレッド数=メモリ消費量

ってのは、わかるんだけど オーバーしたら即 Out of memory ってのもなんだかなぁ。
古いメモリーを自動的に解放したりしないのかなぁ。GC的なものは期待しすぎ?
ちょっとこの辺の仕組みにうといです。勉強不足ですみません。

まぁどのクエリーのときに、Out of memory がでるのかトレースできたら
一番よかったんだけど、毎秒 100 件近く走ってるクエリーを時間もばらばらなものを特定するのは
至難の業だなぁーっと。。。ものぐさな考えで、あきらめていました。

MySQLのパラメータの設定は、1からちゃんと勉強しなおした方がよさそうだなぁ。