Signal Handler In Redis

Redis のシグナル受信時の処理についてサラっと調べてみた。

シグナルハンドラーの登録
サーバ起動時に redis.c::initServer のなかでシグナルハンドラーを登録する。

シグナル処理の種類
シグナルにより、処理は以下の5つに分かれる。

1. 正常終了系
SIGTERM Termination signal

2. セグメンテーションフォールト系
SIGSEGV Invalid memory reference
SIGBUS Bus error (bad memory access)
SIGFPE Floating point exception

3. 無視系
SIGHUP Hangup detected on controlling terminal or death of controlling process
SIGPIPE Broken pipe: write to pipe with no readers

signal(SIGHUP, SIG_IGN);
signal(SIGPIPE, SIG_IGN);

4. そもそもキャッチできない系
SIGILL Kill signal
ちなみに OOM Killer は SIGKILL でプロセスを終了させる。

5.デフォルト動作系
残りのシグナル

シグナル受信時の処理
1. 正常終了系
ハンドラー redis.c::sigtermHandler

ハンドラー内では redisServer.shutdown_asap のフラグを立てる。
このフラグが立っている場合 redis.c::serverCron 関数内で redis.c::prepareForShutdown を呼び出し、以下の終了処理を行う

  1. rdb ファイルをダンプ中プロセスがあれば kill して、ライト中の rdb(スナップショット) ファイルを削除
  2. aof フィアルをダンプ中プロセスがあれば kill して、AOF データをダンプ
  3. rdb ファイルをダンプ
  4. pid ファイルを削除
  5. ソケットを閉じる
  6. exit(0)
$ kill -SIGTERM 352

[352] 25 Mar 18:00:37 # Received SIGTERM, scheduling shutdown...
[352] 25 Mar 18:00:37 # User requested shutdown...
[352] 25 Mar 18:00:37 * Calling fsync() on the AOF file.
[352] 25 Mar 18:00:37 * Saving the final RDB snapshot before exiting.
[352] 25 Mar 18:00:37 * DB saved on disk
[352] 25 Mar 18:00:37 # Redis is now ready to exit, bye bye...

2. セグメンテーションフォールト系
ハンドラー debug.c::sigsegvHandler
Linux/Mac/SUN 系OSでのみ有効
例えば、対応していないBSD系の場合、シグナルデフォルトの動作をする。

Linux だと以下の終了処理を行う

  1. スタックトレース、メモリなどデバッグ情報を出力
  2. pid ファイルを削除
  3. シグナルをデフォルトの動作に戻す(act.sa_handler = SIG_DFL)
  4. 呼ばれたシグナルで自分を kill(kill(getpid(), sig);)
$ kill -SIGSEGV 424

[424] 25 Mar 18:01:15 #

=== REDIS BUG REPORT START: Cut & paste starting from here ===
[424] 25 Mar 18:01:15 #     Redis 2.5.1 crashed by signal: 11
[424] 25 Mar 18:01:15 #     Failed assertion:  (:0)
[424] 25 Mar 18:01:15 # --- STACK TRACE
[424] 25 Mar 18:01:15 # /lib/libc.so.6(epoll_wait+0x33) [0x7f404055a2d3]
[424] 25 Mar 18:01:15 # /lib/libc.so.6(epoll_wait+0x33) [0x7f404055a2d3]
[424] 25 Mar 18:01:15 # ./redis-server(aeProcessEvents+0x5e) [0x41136e]
[424] 25 Mar 18:01:15 # ./redis-server(aeMain+0x2b) [0x4116ab]
[424] 25 Mar 18:01:15 # ./redis-server(main+0x288) [0x417a38]
[424] 25 Mar 18:01:15 # /lib/libc.so.6(__libc_start_main+0xfd) [0x7f4040491c4d]
[424] 25 Mar 18:01:15 # ./redis-server() [0x4109b9]
[424] 25 Mar 18:01:15 # --- INFO OUTPUT
[424] 25 Mar 18:01:15 # # Server
redis_version:2.5.1
redis_git_sha1:dfc25454
redis_git_dirty:1
arch_bits:64
multiplexing_api:epoll
...[snip]...
[424] 25 Mar 18:01:15 # --- CLIENT LIST OUTPUT
[424] 25 Mar 18:01:15 #
[424] 25 Mar 18:01:15 # --- REGISTERS
[424] 25 Mar 18:01:15 #
RAX:fffffffffffffffc RBX:00007f403f86e100
RCX:ffffffffffffffff RDX:00000000000007e0
RDI:0000000000000003 RSI:00007f403f86f000
RBP:00007f403f869990 RSP:00007fff25569530
R8 :000000000000006c R9 :0083c8d0db33dab0
R10:0000000000000064 R11:0000000000000293
R12:0000000000000002 R13:0000000000000000
R14:0000000000000000 R15:00007fff255696f8
RIP:00007f404055a2d3 EFL:0000000000000293
CSGSFS:0000000000000033
[424] 25 Mar 18:01:15 # (00007fff255695a8) -> 00000000004116ab
[424] 25 Mar 18:01:15 # (00007fff255695a0) -> 00007fff255696f8
...[snip]...
[424] 25 Mar 18:01:15 # (00007fff25569530) -> 0000000000000000
[424] 25 Mar 18:01:15 #
=== REDIS BUG REPORT END. Make sure to include from START to END. ===

    Please report the crash opening an issue on github:

        http://github.com/antirez/redis/issues

Segmentation fault

Reference

Advertisements
Tagged with: , ,
Posted in database

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: