既存のパラメータに加えて、だけでなく、マクロによってロックフリーのInnoDBログシステムの設計には、いくつかの制御パラメータを隠すときは、コンパイルcmakeのオプション-DENABLE_EXPERIMENT_SYSVARSを開く= 1するためにソースコードを使用している場合、あなたはパラメータを見ることができます。本論文では、単純に代表されるこれらの隠されたパラメータの意味について持っていました
A.
innodb_log_write_events
innodb_log_flush_events
フラッシュ・イベントのログ書き込み/番号について同様の意味の両方の表現ウェイク待ちは、デフォルト値は2048である
あなたがlsnAで待たなければならないような位置、そして計算されたスロットは、次のとおりです。
スロット=(LSNA - 1)/ OS_FILE_LOG_BLOCK_SIZE&(innodb_log_write / flush_eventsは- 1)
これが意味:同じブロックに取引終了LSNの秋のログをコミットした場合、彼らはの競技イベントを発生させることが
ない場合は転送に大きなパラメータならば、時間の同じブロック内で、もちろん、あなたは競争を減らすことができますが、無効な覚醒があるでしょう
ウェイクアップ動作は、通常、バックグラウンドスレッドのlog_write_notifierまたはlog_flush_notifier非同期で行われますが、ブロックより推進ログの書き込み/フラッシュ少ない場合には、それはlog_writter /フラッシャー
目を覚ますために自分自身を。
B.
innodb_log_recent_written_sizeは、デフォルトの1メガバイトは、
このサイズのrecent_written link_bufを表し、コピー実際には、トランザクションログの量を制御すると同時に、ログバッファに送信され、前方の書き込みならば、ログを書き込むためのログライターを前方に進めることによって、その後、新しいログで参加しました遅い、完全なユーザースレッドとlink_bufが待ちを回転しなければならない可能性があります。別の遅いIOシステムでは、我々は少し、このパラメータを上げることができます
innodb_Log_recent_closed_size、デフォルトの2メガバイトは
最近閉じlink_bufの大きさを表し、だけでなく、メンテナンスが挿入され、ダーティページのフラッシュリストの同意に送信することができ、低速またはlin_buf挿入ダーティページが合併を促進しなかった場合、それは待機を回転します
简单说下link_buf, 这本质上是一个数组,但使用无锁的使用方式来维护lsn的推进,比如获得一个lsn开始和结束,那就
通过设置buf[start_lsn] = end_lsn的类似方式来维护lsn链,基于lsn是连续值的事实,最终必然不会出现空洞,所以在演化的过程中,可以从尾部
推进连续的lsn,头部插入新的值.
如果新插入的值超过了尾部,表示buf满了,就需要spin wait了
C.の
innodb_log_wait_for_write_spin_delay、
innodb_log_wait_for_write_timeout
バージョン8.0のユーザーはやり直しが、書くためにバックグラウンドスレッドを待って、もはや自分自身のスレッドを書くことから、これらの二つの変数は、時間のスピン期間は、所望の点のLSNに進んでいないスピンとタイムアウト状態の待機時間を制御します時間は、条件待ちに入ります
他の二つの変数は
innodb_log_wait_for_flush_spin_delay
innodb_log_wait_for_flush_timeout
似た意味が、指定されたLSNにログフラッシュを待っています
実際の計算過程では、スピンの最大数、CPU使用率が考慮に入れるだけでなく、2つのパラメータが追加されることに注意してください:
innodb_log_spin_cpu_abs_lwm
innodb_log_spin_cpu_pct_hwm
もしそうであれば、平均待機時間がこの制限を超えると、フラッシュ操作を待ち、またパラメータinnodb_log_wait_for_flush_spin_hwm制限を受け、このパラメータは、フラッシュ、フラッシュのために待機する時間の上限を制御し、その後スピンする必要はありませんが、直接条件待ちに
関数内のスピンの数で計算log_max_spins_when_waiting_in_user_thread
「の:
CIは、関数値innodb_log_wait_for_write_spin_delayまたはinnodb_log_wait_for_flush_spin_delayのパラメータであり、
static inline uint64_t log_max_spins_when_waiting_in_user_thread(
uint64_t min_non_zero_value) {
uint64_t max_spins;
/* Get current cpu usage. */
const double cpu = srv_cpu_usage.utime_pct;
/* Get high-watermark - when cpu usage is higher, don't spin! */
const uint32_t hwm = srv_log_spin_cpu_pct_hwm;
if (srv_cpu_usage.utime_abs < srv_log_spin_cpu_abs_lwm || cpu >= hwm) {
/* Don't spin because either cpu usage is too high or it's
almost idle so no reason to bother. */
max_spins = 0;
} else if (cpu >= hwm / 2) {
/* When cpu usage is more than 50% of the hwm, use the minimum allowed
number of spin rounds, not to increase cpu usage too much (risky). */
max_spins = min_non_zero_value;
} else {
/* When cpu usage is less than 50% of the hwm, choose maximum spin rounds
in range [minimum, 10*minimum]. Smaller usage of cpu is, more spin rounds
might be used. */
const double r = 1.0 * (hwm / 2 - cpu) / (hwm / 2);
max_spins =
static_cast<uint64_t>(min_non_zero_value + r * min_non_zero_value * 9);
}
return (max_spins);
}
D.以下のパラメータをバックグラウンドスレッドとタスクのスピン状態待ちタイムアウト値を待っている
log_writerスレッド:
innodb_log_writer_spin_delay、
innodb_log_writer_timeout
log_flusher线程:
innodb_ log_flusher_spin_delay
innodb_log_flusher_timeout
log_write_notifier线程:
innodb_ log_write_notifier_spin_delay
innodb_log_write_notifier_timeout
log_flush_notifier线程
innodb_log_flush_notifier_spin_delay
innodb_log_flush_notifier_timeout
log_closerスレッド(専用スレッドの推進のためには、このlink_bufをrecent_closed)
innodb_log_closer_spin_delay
innodb_log_closer_timeout
Eは
innodb_ log_write_max_sizeは
recent_written予め計算BUFリンクは、この制限が小さすぎる個人ことが、このパラメータは適切な大きさに調整することができる場合にこれは、デフォルトは4キロバイトであり、バイトの最大数を可能にするために、書き込み操作を表します。(ただし、8.0 innodb_log_write_ahead_sizeの最大書き込み制限も限定されて、両方が一緒に撮影しました)
Fは
innodb_log_checkpoint_everyの
デフォルトは1000ミリ秒(1秒)、また、他の要因によって影響を受けたチェックポイントは、特定の機能を参照してください場合は、すべてのチェックポイントは限りlog_checkpointerスレッドは確かでしょう少なくとも一度実行しようとする表現しました。log_should_checkpoint
:
a) more than 1s elapsed since last checkpoint
b) checkpoint age is greater than max_checkpoint_age_async
c) it was requested to have greater checkpoint_lsn,
and oldest_lsn allows to satisfy the request
G.参考:
MySQL8.0.16ソースコード