mariadb InnoDB: A semaphore wait… 해결은 못했어.

4월 25일, 그리고 5월 19일. 모두 이 오류가 발생했다. 고마운 JetPack 덕에 오류는 금방 알 순 있었는데..

이 상황이 되면 시스템 CPU 사용률이 치솟고, 그 결과 접속이 불가능해진다. 두 상황 모두 PC 앞에 앉아있진 않았기에, 어떤 조치를 직접 취할 수는 없었다.


문제는, 이 오류를 막을 확실한 방법이 (적어도 내게는) 없다는데 있다.

정확한 오류 메시지는 이렇다.

 5월 19 19:01:31 webserver mariadbd[895]: 2021-05-19 18:51:31 0 [Warning] InnoDB: A long semaphore wait:
 5월 19 19:01:31 webserver mariadbd[895]: --Thread 139982958225152 has waited at srv0srv.cc line 1544 for 326.00 seconds the semaphore:
 5월 19 19:01:31 webserver mariadbd[895]: X-lock (wait_ex) on RW-latch at 0x55dcb5049fb8 created in file dict0dict.cc line 1041
 5월 19 19:01:31 webserver mariadbd[895]: a writer (thread id 139982958225152) has reserved it in mode  wait exclusive
 5월 19 19:01:31 webserver mariadbd[895]: number of readers 1, waiters flag 0, lock_word: ffffffff
 5월 19 19:01:31 webserver mariadbd[895]: Last time write locked in file srv0srv.cc line 1544

이 문제를 해결하기 위해 뒤져보니, 딱히 이렇다할 방법은 없고 innodb_adaptive_hash_index 를 0 으로 바꾸라든가, 또는 innodb_purge_threads 값을 기본설정인 4 에서 1로 바꾸라는, 이른바 ‘설(說, 썰, 가설, 또는 의견?)’만 난무했다.

흠..

innodb_adaptive_hash_index 는 이미 0 으로 설정돼 있다.
innodb_purge_threads 는 4 인데, 속는 셈치고(?) 1로 바꿔봤다.


1로 바꾸는 방법은 MariaDB 홈페이지를 참고했고, 그 중 설정 파일을 만드는 방식을 택했다.

# /etc/mysql/mariadb.conf.d/70-myconf.cnf
[mariadb]
innodb_purge_threads=1

자.. 과연 이걸로 해결이 될지?
시간이 지나야 알 수 있겠지.


헌데, 그 이전에 조금 애매한게 또 있다.

 5월 19 18:09:01 webserver CRON[7669]: (root) CMD (  [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
 5월 19 18:09:01 webserver CRON[7668]: pam_unix(cron:session): session closed for user root
 5월 19 18:09:02 webserver systemd[1]: Starting Clean php session files...
 5월 19 18:09:02 webserver systemd[1]: Started Clean php session files.
 5월 19 18:17:01 webserver CRON[7777]: pam_unix(cron:session): session opened for user root by (uid=0)
 5월 19 18:17:01 webserver CRON[7778]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
 5월 19 18:17:01 webserver CRON[7777]: pam_unix(cron:session): session closed for user root
 5월 19 18:30:43 webserver systemd-networkd[654]: eth0: Configured
 5월 19 18:30:43 webserver systemd-timesyncd[531]: Network configuration changed, trying to establish connection.
 5월 19 18:30:43 webserver systemd-timesyncd[531]: Synchronized to time server 91.189.94.4:123 (ntp.ubuntu.com).
 5월 19 18:39:14 webserver CRON[8168]: pam_unix(cron:session): session opened for user root by (uid=0)
 5월 19 18:39:17 webserver systemd[1]: Starting Clean php session files...
 5월 19 18:39:14 webserver CRON[8169]: (root) CMD (  [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
 5월 19 18:39:14 webserver CRON[8168]: pam_unix(cron:session): session closed for user root
 5월 19 18:50:57 webserver mariadbd[895]: 2021-05-19 18:50:47 3037 [Warning] Aborted connection 3037 to db: 'unconnected' user: 'unauthenticated' host: 'localhost' (This connection closed normally without authentication)
 5월 19 18:51:12 webserver systemd[1]: snapd.service: Watchdog timeout (limit 5min)!
 5월 19 19:01:31 webserver mariadbd[895]: 2021-05-19 18:51:31 0 [Warning] InnoDB: A long semaphore wait:

뭘하는 건지는 모르지만, 시시때때로 sessionclean 이 실행된다. 이게 제대로 돌아가면 StartingStarted 가 되고, 정상 종료가 돼야 하는데..

semaphore 오류가 나기 바로 전, 18:39:17 에 Starting 은 했으나 Started 가 되지 않았고, 그 뒤에 Aborted connection 오류가 발생했으며, 결국 semaphore 오류로 이어졌다.

그렇다면 문제는 php sessionclean 에 있는건가..??
아 귀찮아!!!

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.