MySQL/MySQL engine

show engine innodb status 보는법 - 세마포어

lejpower 2021. 8. 31. 23:27
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 34862552 スレッドがセマフォの配列に入ったOS待ち(OS wait)の回数
OS WAIT ARRAY INFO: signal count 116266440
==>signal countが配列に入ってOSからシグナルを受け取った回数です。後述しますが、この回数は少ないほど良いです。
Mutex spin waits 545963329, rounds 2602243608, OS waits 17985576
RW-shared spins 44035445, rounds 395257570, OS waits 8059822
RW-excl spins 19326255, rounds 500665340, OS waits 6158791
Spin rounds per wait: 4.77 mutex, 8.98 RW-shared, 25.91 RW-excl


spin waits : Mutex의 스핀락 대기에 들어간 횟수.

rounds : Mutex의 스핀락 대기에 들어간 락의 스핀라운드 총수

OS waits : 스핀락 대기를 해도 뮤텍스를 취득하지 못한 경우에, 오페레이팅 시스템이 관리하고 있는 세마포어에 넘겨지는 락의 횟수

innoDB는 스핀락대기 => OS대기의 순서로 락의 취득을 시도합니다.

스핀락대기에 들어간 락은 innodb_sync_spin_loops에 설정된 스핀라운드 수 (취득대기회수)를 넘을 경우에 OS대기에 넘겨지게 됩니다. OS대기는 스핀락대기에 비해서 처리 코스트가 크기 때문에 일반적으로 OS대기 숫자가 작은 것이 바람직 합니다.

OS대기가 많이 발생하게 되는 경우는 디스크 I/O, InnoDB내부에서 이러한 락에 관련된 경합이 발생하고 있을 가능성이 큽니다. OS대기가매초10000이상이 된다면 OS대기를 줄이기 위한 튜닝을 하도록 합니다. MySQL의 스레드 수의 변경 (innodb_thread_concurrency 설정값)이 효과가 있을 수 있습니다.