ggatec デバイスをスワップに使うとデッドロックを起こす2016年02月04日 13時08分55秒

FreeBSD の更新時に ggate が気になる様に普段から ggate は色々と使っている。公開先が一台のホストのみで、パーティション全てを占有でネットワーク越しに使うのなら NFS よりも断然早い。

実験の意味もあって今回 ggatec でインポートしたデバイスを swapon をして、スワップに使っていた。これはかなり危ない。ggatec のプロセスもスワップアウトしてしまうらしく、状況によっては復帰不可能になる。

第一段階の症状として、ggatec がスワップアウトしてしまう事。そうすると、pagein が出来なくなる。ggatec がメモリに戻らないと pagein が出来ないのだが、デバイスにアクセスする ggatec プロセスが、そのデバイス上に。そのような状態なると、swap pager が読み込みを待ち続けるので、以下のようなエラーがコンソールに出される。

swap_pager: indefinite wait buffer: bufobj: 0, blkno: xxxxxxxxxxx, size 4096

この状態になった時に、運良くシェルやログイン等がスワップアウトしていなくて、利用可能な状態であれな、ggatec rescue にて、ggate デバイスを復帰することが出来ると、何とか回復することが出来る。

しかし、運悪く既に全てのシェルとターミナルがスワップアウトしていると、残念ながら復旧は不可能。スワップをメモリに呼び戻す為に必要なプロセスが、スワップデバイス上にある為に、まさにデッドロック。

手も足も出ない状況でも、nfs サーバとしては機能していた。nfsd にはスワップアウトされない特別な仕掛けがしてあるのかも知れない。

次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2016/02/04/8008506/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。