malloc/free 도중 deadlock 걸리는 현상 (Centos 6.5 / glibc 2.12)

dao_3651의 이미지

malloc/free 도중 deadlock이 걸리는 현상이 발생 합니다.

반기에 한번 정도.. 발생하는 현상입니다.

gcore로 덤프를 내려서 보면.. 다음과 같이 나옵니다.

(gdb) thread 7
[Switching to thread 7 (Thread 0x7f79713e9700 (LWP 15229))]#0 0x000000353fef80ce in __lll_lock_wait_private () from /lib64/libc.so.6
(gdb) bt
#0 0x000000353fef80ce in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x000000353fe7d313 in _L_lock_10110 () from /lib64/libc.so.6
#2 0x000000353fe7abbf in malloc () from /lib64/libc.so.6
#3 0x00000000005a7094 in mcache_appendNewMsgs (ptTflock=0xd4b400, ptService=0xf07ff4, cpBaseDir=0xd4a120 "/opt/TerraceTims", ptCache=0x7f79713e6e10, iUid=1000, iGid=1000, ptEncrypt=0xf08080,
cpEmail=0x7f79713e59a0) at idx/mdb_mbox.c:1425
#4 0x000000000042063a in cmd_select (ptSess=0x7f79713df390, pcTag=0x7f79713df250 "A7") at im_cmd.c:3687
#5 0x0000000000430cab in im_cmd (ptSess=0x7f79713df390, pcTag=0x7f79713df250 "A7") at im_cmd.c:4265
#6 0x000000000041d454 in im_loop (ptSess=0x7f79713df390) at im_loop.c:120
#7 0x000000000041411a in im_application (pSoh=, ptSess=0x7f79713df390) at im_appl.c:122
#8 0x000000000040ff58 in __JobMain (arg=) at im_jobserv.c:167
#9 0x0000003540207a51 in start_thread () from /lib64/libpthread.so.0
#10 0x000000353fee896d in clone () from /lib64/libc.so.6
(gdb) thread 8
[Switching to thread 8 (Thread 0x7f7973fff700 (LWP 15441))]#0 0x000000353fef80ce in __lll_lock_wait_private () from /lib64/libc.so.6

(gdb) bt
#0 0x000000353fef80ce in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x000000353fe7d313 in _L_lock_10110 () from /lib64/libc.so.6
#2 0x000000353fe7abbf in malloc () from /lib64/libc.so.6
#3 0x00000000005a7094 in mcache_appendNewMsgs (ptTflock=0xd4b400, ptService=0xf07ff4, cpBaseDir=0xd4a120 "/opt/TerraceTims", ptCache=0x7f7973ffce10, iUid=1000, iGid=1000, ptEncrypt=0xf08080,
cpEmail=0x7f7973ffb9a0) at idx/mdb_mbox.c:1425
#4 0x000000000042063a in cmd_select (ptSess=0x7f7973ff5390, pcTag=0x7f7973ff5250 "nott") at im_cmd.c:3687
#5 0x0000000000430cab in im_cmd (ptSess=0x7f7973ff5390, pcTag=0x7f7973ff5250 "nott") at im_cmd.c:4265
#6 0x000000000041d454 in im_loop (ptSess=0x7f7973ff5390) at im_loop.c:120
#7 0x000000000041411a in im_application (pSoh=, ptSess=0x7f7973ff5390) at im_appl.c:122
#8 0x000000000040ff58 in __JobMain (arg=) at im_jobserv.c:167
#9 0x0000003540207a51 in start_thread () from /lib64/libpthread.so.0
#10 0x000000353fee896d in clone () from /lib64/libc.so.6

....

대략 10개 정도 Thread가 비슷한 현상으로 lock걸려 있네요. (예시에는 없지만.. free에서도 발생 함.)

이놈들이 종종 malloc 전에 db lock를잡고 deadlock에 빠져버려서.. 대환장파티가 열립니다. ㅠㅠ

검색해보니, signal, syslog 그리고 fork 조심 하라고 하는데..

signal, syslog는 해당 사항 없지만.. fork는 살짝 관련이 있네요.. 일은 child에서 하고 child 가 죽으면 parent가 다시 살리거든요..

혹시 비슷한 현상으로 고생 하는분 있으신가요?

우선 재현 되는 example이라도 만들려고 하는데.. 상용에서는 종종 발생 하는데.. 테스트 환경에서는 도무지 발생 하고 있지 않네요 ㅠㅠㅠ

익명 사용자의 이미지

10개 정도(?) 다 올려주세요.

십중팔구 어떤 스레드가 malloc이나 free 호출 중에 lock을 잡은 시점에서 뭔가 비동기적인 메커니즘으로 다른 데로 날아가서, 거기서 또 malloc이나 free를 호출한 듯. 그 스레드의 call stack을 찾아서 뭐 때문에 날아갔는지 찾아봐야 할 겁니다.

karkayan의 이미지

child가 죽은 경우를 어떻게 파악하나요? SIGCHLD 시그널 핸들러를 만드셨나요?
그러면 시그널 핸들러에서 malloc을 사용하고 있나요?

dao_3651의 이미지

stack은 많아서 txt으로 첨부 하였습니다.

child의 down됨은 SIGCHLD으로 파악 하고 있으나.. malloc은 사용하고 있지 않습니다.

현상이 발생한 시점과 마지막으로 child가 재기동 된 시간차이는 하루정도 갭이 있네요.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon core_stackall_20190403.txt27.41 KB
dao_3651의 이미지

Thread 5 ~ 13 까지 __lll_lock_wait_private 에 걸려있는데..

thread 5 0x7f792f5fa700 15:23:03
thread 6 0x7f79723f1700 15:26:55
thread 7 0x7f79713e9700 15:30:33
thread 8 0x7f7973fff700 15:28:47
thread 9 0x7f792eff7700 15:27:39
thread 10 0x7f79b3b36700 15:27:44
thread 11 0x7f7972ff7700 15:31:01
thread 12 0x7f79715ea700 15:34:45
thread 13 0x7f792e1f0700 15:36:44

로그 비교해보면 deadlock이 전부다 비슷한 시간대에 발생 하였네요..

이벤트가 있었나 해서 /var/log/message 봤는데 깨끗.. ㅠㅠ

저 코어는 현상 발생하고 하루 뒤에 잡은 것 인데.. 저기 걸려있는 lock은 하루이상 잡혀 있었다고 봐야겠네요 ㅠㅠ

dao_3651의 이미지

의도적으로 재현을 시도 해보았지만.. 안되었습니다.

리포팅 된 다음 이슈를 보고.. 사이트에 glibc 빌드버전 glibc-2.12-1.166.el6_7.1 이상으로 올려보기로 하였습니다. (동일한 현상이기에.. 가능성이 있어보입니다.)

https://bugzilla.redhat.com/show_bug.cgi?id=1244002

기타 참고할만한 링크입니다.

https://sourceware.org/bugzilla/show_bug.cgi?id=13699
https://bugzilla.redhat.com/show_bug.cgi?id=1244002
https://www-01.ibm.com/support/docview.wss?uid=swg22001561
https://github.com/mperham/sidekiq/issues/2796

수고하세요..

혹시나 이런 현상 격으신 분들 계시면.. 답글 달아주세요.. ㅠㅠ 아직 해결 된게 아니기에.. ㅠㅠ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.