設定
私はかなり長い間プログラマーをしていますが、深い内部の事柄についてはまだよくわかっていません。
さて、私は以下のいずれかを行うことは良い考えではないことをよく知っています:
- プロセスをkill -9する(悪い)
- 稼働中のコンピュータやサーバーの電源プラグを突然抜く(さらに悪い)
しかし、時にはそうしなければならないこともあります。何をしてもプロセスが応答しないこともありますし、何をしてもコンピューターが応答しないこともあります。
mod_wsgi 経由で Apache 2、MySQL 5、PHP 5、Python 2.6.5 を実行しているシステムを想定します。
注: ここでは Mac OS X に最も興味がありますが、UNIX システムに関連する回答があれば助かります。
私の懸念
これらのいずれか、特に 2 番目の操作を実行するたびに、何かが壊れているのではないかとしばらくの間非常に心配になります。どこかのファイルが壊れている可能性があります。どのファイルが壊れているかは誰にもわかりません。コンピューターには 1,000,000 を超えるファイルがあります。
私はよく OS X を使用しているので、ディスクユーティリティで「ディスクの検証」操作を実行します。問題は報告されませんが、それでも心配です。
どこかの設定ファイルがおかしくなったらどうなるでしょうか。あるいは、もっと悪いことに、どこかのバイナリ ファイルが壊れていたらどうなるでしょうか。あるいは、どこかのスクリプト ファイルが壊れていたらどうなるでしょうか。ハードウェアが損傷していたらどうなるでしょうか。
来月、破損や損傷が大惨事を引き起こす危機的な状況になるまで、そのことに気づかなかったらどうなるでしょうか?
あるいは、貴重なデータがすでに失われていたらどうでしょうか?
私の希望
これらの懸念や心配が根拠のないものであることを願っています。結局のところ、これまで何度もこれを実行してきましたが、本当に悪いことはまだ何も起きていません。最悪なのは、いくつかの MySQL テーブルを修復しなければならなかったことですが、データは失われていないようです。
しかし、私の心配が根拠のないものではなく、状況 1 または 2 のいずれかで実際の損害が発生する可能性がある場合、それを検出して防止する方法があることを期待します。
私の質問
これは、現代のオペレーティング システムが、このようなシナリオで何も失われないように設計されているからでしょうか。現代のソフトウェアが、何も失われないように設計されているからでしょうか。現代のハードウェア設計はどうでしょうか。電源プラグを抜くときには、どのような対策が講じられているのでしょうか。
私の質問は、この両方のシナリオにおいて、その通り問題が発生する可能性があり、それを修正するにはどのような手順を踏む必要がありますか?
問題が発生する可能性があるのは、一部のプログラムがデータをディスクにフラッシュしていないため、ディスクに書き込まれるはずだった最新のデータ (たとえば、電源を切る数秒前) が失われる可能性があるという印象を受けます。しかし、それ以上はどうでしょうか。また、この 5 秒間のデータ損失の問題によって、システムが台無しになる可能性はありますか。
ハードドライブ上の膨大なファイルの森のどこかに隠れているランダムなファイルが破損したらどうなるでしょうか?
ハードウェアの損傷はどうですか?
私にとって最も役立つものは何だろう
プロセスを kill -9 するか、システム全体の電源を切ったときに内部で何が起こるかについての詳細な説明。(一瞬のように思えますが、誰か私のために速度を遅くしてもらえませんか?)
これらのシナリオで問題が発生する可能性のあるすべての事柄についての説明と、(もちろん大まかな) 確率 (つまり、これは非常に起こりそうにないが、これは起こりそうである)...
このようなシナリオが発生した場合に損傷や破損を防ぐために、最新のハードウェア、オペレーティング システム、ソフトウェアに導入されている対策の説明。(安心させるために)
ドライブのどこかに破損や損傷がないことを本当に確認するために、「ディスクの検証」を超えて、kill -9 または電源の引き抜き後に行うべきことに関する手順。
コンピュータのセットアップを強化するために実行できる対策。これにより、何かを強制終了したり、電源を抜いたりする必要がある場合でも、潜在的な損害が軽減されます。
バイナリ ファイルに関する情報ですが、Apache バイナリ ファイルまたは一部のライブラリの途中で 1 バイトまたは 2 バイトがランダムに破損していて、それが後で問題を引き起こす可能性があるというのは本当ではないでしょうか。これが電源の引き抜きまたは強制終了の結果として発生したのではないことをどのように確認すればよいでしょうか。
本当にありがとう!
答え1
電源を切ると、警告なしにすべてが停止します。kill -9は単一のプロセスに対して同じ効果があり、強制的に終了します。シグナルキル。
プロセスがカーネルまたは停電によって強制終了された場合、クリーンアップは行われません。つまり、ファイルが半分書き込まれたり、状態が矛盾したり、キャッシュが失われたりする可能性があります。ジャーナリング、終了ステータス、バッテリ バックアップがあるため、通常はこれらについて心配する必要はありません。
/tmp 内の一時ファイルは tmpfs 内にある場合は自動的に削除されますが、Firefox の lock や .parentlock など、削除する必要があるアプリケーション固有のロック ファイルがまだ残っている可能性があります。
ほとんどのソフトウェアは、正常終了ステータスが記録されない場合、トランザクションを再試行するほどスマートです。典型的なメール システムがその良い例です。メッセージが配信されていて、途中で中断された場合、送信者は成功するまで後で再試行します。
おそらく、ファイルシステムはジャーナリングされています。ファイルを移動または書き込み中にそのファイルが途中で停止した場合でも、ジャーナリングされたファイルシステムは元のファイルを参照します。ジャーナリングされたファイルシステムは、変更を非破壊的に行い、古いコピーを残して、ディスク上で古いコピーが占めていたスペースを再利用する前に、最後のステップとしてのみ新しいコピーを参照します。
RAID アレイをお持ちの場合、パフォーマンスを向上させ、停電時の信頼性を確保するために、あらゆる種類のメモリ バッファが備えられています。ファイルシステムはデバイス内のキャッシュとその状態を認識していない可能性が高いため、変更がディスクにコミットされたと認識しますが、変更は RAID キャッシュのどこかに残っています。では、電源が切れるとどうなるでしょうか。RAID エンクロージャに機能するバッテリーがあり、それを監視していることを願います。そうでない場合は、ファイルシステムが破損し、fsck を実行する必要があります。
はい、バイナリでは数ビットが破損する可能性がありますが、最新のハードウェアではそれほど心配する必要はありません。本当に心配な場合は、適切なツールを使用してディスクと RAID の状態を監視することができますが、いずれにしてもそうする必要があります。定期的にバックアップを行い、無停電電源装置を入手してください。
答え2
予期しないシャットダウンの場合、破損する可能性のあるファイルは、書き込み用に開かれているファイルのみです。ほとんどのシステムでは、どの時点においても、ファイルに書き込むことはおそらくありません。おそらく。
1 キル -9
POSIX SIGKILL であり、実装に依存します。このシグナルを受信したプロセスには、それを処理する機会が与えられません。
1 電源オフ
ハードウェアによって異なります。ヘッドはドライブの勢いによって自動的に停止し、書き込みキャッシュ内のすべてが DRAM リフレッシュを失い、数秒以内に回復不能な破損に陥ります。システム メモリ、CPU キャッシュ、レジスタなどでも同じことが起こります。
wdc.com より (google: site:wdc.com Protective Head Parking)
電源が失われました: ハード ドライブがリセットされます。ヘッドはスピンドル エネルギーを使用してランディング ゾーンに停止します。スピンドル モーターは停止します。
2 - 何が問題になるのか
開いたままのファイルは不完全に書き出されます。ファイルを書き込み用に開くと、データが破損します。最近のハードウェアではファイルの書き込みが高速で、最近の PC は通常 IO でストレスを感じることはありません。静かな田舎道を目隠しして歩いているようなものです。ほとんどの場合、問題ありません。
3 - 対策
ディスクの機能については上記を参照してください。
ジャーナル化されたファイルシステムを調べてください。現在は正常です。http://en.wikipedia.org/wiki/ジャーナリングファイルシステム
MS Word や vi などのソフトウェアは、元のファイルではなく一時ファイルに書き込みます。目的は、ディスク上に一貫したコピーがない状態をシステムから決して残さないことです。
Windows はレジストリのコピーを保持します (これは非常に重要なことです)。Wikipedia: 「Windows 2000 はレジストリ ハイブ (.ALT) の代替コピーを保持し、破損が検出されるとそのコピーに切り替えようとします」(私は Win2k 以降、本格的な技術サポートを行っていないため、MS の新しいメカニズムがどのようなものかはよくわかりません)
4 - 何をすべきか
難易度順(簡単~難しい)
- バックアップを保存する
- 最後に作業していた内容を確認する
- 別のディスクから起動し、最終更新日時を調べて、クラッシュ時にシステムが何をしていたかを確認します。
- 別のディスクから起動し、すべてのファイルの md5sum をオフライン コピーと比較します。
バックアップを保存するのが最も適切な答えです。適切なバックアップがあれば、以前に変更したバージョンに戻すことができます。
5
冗長電源ですか? エンドユーザー教育ですか? 電源ボタンにテープと段ボールを貼りますか?
6
ハードウェアの故障、ディスク ドライバーの破損、OS カーネルの破損、チェックサムの欠如、アップグレード中のクラッシュなどの場合を除き、バイナリとライブラリは読み取り/書き込みモードで開かれないため、破損することはありません。破損することはありますが、まれです。
答え3
kill -9 については、プロセスにその場で「終了」する信号が送信されます。プロセスは終了します (中断できないスリープ状態の場合はゾンビになります)。ファイルは閉じられず、データは書き出されず、プログラムはこの信号をキャッチして他の処理を実行することはできません。クリーンアップも何も行われず、ただ終了します。
今日のファイル システムは非常に堅牢です。XFS、JFS、ext3、ext4 などはすべて、ファイル システムのメタデータをそのまま維持するためのジャーナルやその他の機能を備えています。
Apache 自体やその他のバイナリは、メモリ内にあるか読み取り中であるため、突然の電源喪失やシステム キルによって破損する可能性は低いです。読み取り中の場合 (つまり、Apache HTTP が起動している場合など)、電力サージによってバイナリが破損する可能性がありますが、その可能性は低いようです。
私は Mac Mini を持っていますが、人々は電源を切るのが好きなようで (何度言っても.....)、そのまま電源を入れ続けます。
ほとんどの場合、kill -9 に頼ったり、定期的に電源をオフにしたりしない限り、あまり心配する必要はありません。以前は状況がずっと悪かったので、たとえば Solaris 2.6 よりも Solaris 10 などの方が心配でした。
答え4
「kill -9」は保留中の IO 操作を同期しません。これは多くの場合問題にはなりませんが、システムの IO 負荷が大きい場合は、データが失われる可能性があります。
これはサーバーでより深刻な問題となり、RAID コントローラー (バッテリー バックアップ キャッシュなし) が書き込みをキャッシュしてデータが失われる可能性があります。
編集: もう 1 つ... ネットワーク マウントされたドライブに依存していて、ファイル ハンドルを開いている場合、ファイルが不整合になったり破損したりする可能性が非常に高くなります。Windows では、ユーザーが Outlook PST ファイルを共有にマウントし、電源やネットワーク接続が失われたときに、この典型的な例が見られます。