サーバ変数とステータス変数

本件とは関係ないけど、昨日はsennaの開発者の方のお話をいろいろ伺うことができて楽しかったす。ラーメンも相変わらず旨し。

で、"SHOW VARIABLES"、"SHOW STATUS"で見れる変数の話。どこかにメモっておいた筈が見当たらないので多分メモらなかったんだろう。でもって案の定、内容をあっさりと忘れてて、加齢とともに脳の退化が進んでいることを実感し、軽く涙す。

さてさて。

サーバ変数、ステータス変数ともにmysqld.ccに実装されているわけです。長いので内容は引用しないけど。

struct my_option my_long_options[] = {...};
struct show_var_st status_vars[] = {...};

こんな感じでずらーっと実装されとる。

MySQLのリファレンスマニュアルにはもちろんこれらの変数について一つ一つ説明が書かれているけれども、「丁寧な説明」とはちょっと言いがたい内容になっている。既存の出版物とかも、マニュアルをベースにしているもが多いので、ある特定の変数について詳しく知りたいと思うと、困るときがある。

また運の悪いことにというか、ステータス変数についてはMySQLの内部の関数の呼び出しに伴ってカウントアップされるものとかが結構あり、MySQLブラックボックスとしてみたいユーザにとっては、意味不明瞭のものも結構ある。

でー、どうするかというと今はソースを読むのが一番手っ取り早いと思ふ。OSSだし。



ステータス変数の話。

ステータス変数のスコープ、グローバルとセッション。"SHOW GLOBAL STATUS"の時に、全てのセッションの値を回収して返すってのは理解したのだけれども、

  *to= global_status_var;
  while ((tmp= it++))
    add_to_status(to, &tmp->status_var);
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var)
{
  ulong *end= (ulong*) ((byte*) to_var + offsetof(STATUS_VAR,
						  last_system_status_var) +
			sizeof(ulong));
  ulong *to= (ulong*) to_var, *from= (ulong*) from_var;
  while (to != end)
    *(to++)+= *(from++);
  /* it doesn't make sense to add last_query_cost values */
}

上のwhileで繰り返し関数が呼ばれて"+="で足してるってことはセッション側に入っているのは各セッションによる差分のみ? gdbで見ると差分っぽい。

追記 THD::initでbzeroしとる。

void THD::init(void)
{
  ...
  bzero((char *) &status_var, sizeof(status_var));
}

内部実装のグローバル変数は、THDのデストラクタで更新されるのは分かったけれども

THD::~THD()
{
  ...
  add_to_status(&global_status_var, &status_var);
  ...
}

んんん、ちょっと混乱してきた。

理解しますた。

  if (lex->option_type == OPT_GLOBAL)
    calc_sum_of_all_status(&tmp);
  res= show_status_array(thd, wild, status_vars, OPT_GLOBAL,
                         (lex->option_type == OPT_GLOBAL ? 
                          &tmp: &thd->status_var), "",tables->table);

GLOBALだろうがSESSIONだろうがお構いなしにOPT_GLOBALを引数に使っていて、これはつまり渡したものを単に結果として返すということ。SHOW SESSION STATUSでは各セッションでの"差分のみ"が表示されるのはこのため。

SHOW GLOBAL..の実体の値そのものはcloseのタイミングで更新がかかる。従ってそのときの正確な値を持つ実体の値があるわけではなく、その都度、集計しているので、もしかすると良くないかもということ。高負荷時に1秒おきにSHOW GLOBAL STATUSとかやると集計時のMuTEXの影響範囲がでかいので注意と。

そうはいうものの、各変数を本当に本当のglobal使っちゃうと排他制御しなきゃいけないのでそれはそれで困るので、今みたいになっている、という感じの理解でOK?

関係ないけど、デュアルディスプレイとかいいなぁ。うらやましー。