Mik*_*ike 14 electrical-power kill corruption
设置
我已经当了很长一段时间的程序员了,但我对深入的内部事物仍然有点模糊。
现在。我很清楚以下两种情况都不是一个好主意:
但是,有时您只是不得不这样做。有时,无论您做什么,进程都不会响应,有时,无论您做什么,计算机都不会响应。
让我们假设一个系统通过 mod_wsgi 运行 Apache 2、MySQL 5、PHP 5 和 Python 2.6.5。
注意:我在这里对 Mac OS X 最感兴趣,但是适用于任何 UNIX 系统的答案会帮助我解决问题。
我的顾虑
每次我必须做其中任何一个,尤其是第二个时,我很担心一段时间内有什么东西坏了。某处的某些文件可能已损坏——谁知道是哪个文件?计算机上有超过 1,000,000 个文件。
我经常使用 OS X,所以我将通过磁盘工具运行“验证磁盘”操作。它不会报告任何问题,但我仍然担心这一点。
如果某个地方的某个配置文件被搞砸了怎么办。或者更糟糕的是,如果某个地方的二进制文件损坏了怎么办。或者某个地方的脚本文件现在已损坏。如果某些硬件损坏怎么办?
如果我直到下个月才发现它,在危急情况下,当腐败或损坏导致灾难时怎么办?
或者,如果有价值的数据已经丢失怎么办?
我的希望
我希望这些担忧和担忧是没有根据的。毕竟,在之前做过很多次之后,真正糟糕的事情还没有发生。最糟糕的是我不得不修复一些 MySQL 表,但我似乎没有丢失任何数据。
但是,如果我的担忧不是没有根据的,并且在情况 1 或 2 中都可能发生真正的损害,那么我希望有一种方法可以检测到它并防止它发生。
我的问题
这可能是因为现代操作系统旨在确保在这些情况下不会丢失任何内容吗?这可能是因为现代软件旨在确保不会丢失任何东西吗?现代硬件设计怎么样?拔电源插头时有哪些措施?
我的问题是,对于这两种情况,究竟会出现什么问题,应该采取哪些步骤来修复它?
我的印象是,可能会出错的一件事是某些程序可能没有将其数据刷新到磁盘,因此任何应该写入磁盘的最新数据(例如,在断电前几秒钟) ) 可能会丢失。但除此之外呢?这个 5 秒数据丢失的问题会破坏系统吗?
隐藏在我硬盘驱动器上巨大文件森林中某处的随机文件损坏怎么办?
硬件损坏怎么办?
什么对我最有帮助
当您杀死 -9 进程或关闭整个系统的电源时,有关内部发生的情况的详细说明。(似乎是即时的,但有人可以帮我放慢速度吗?)
对这些场景中可能出错的所有事情的解释,以及(当然是粗略的)概率(即,这是非常不可能的,但这是可能的)......
描述现代硬件、操作系统和软件中已采取的措施,以防止发生这些情况时发生损坏或损坏。(安慰我)
除了“验证磁盘”之外,关于在 kill -9 或电源拉动后要做什么的说明,以真正确保驱动器上的某处没有损坏或损坏。
可以采取的措施来强化计算机设置,以便在必须杀死某些东西或必须切断电源时,减轻任何潜在的损害。
关于二进制文件的一些信息——apache 二进制文件或某个库可能有一个或两个随机字节在中间损坏,这不是真的吗?我如何向自己保证这不是由于拉力或击杀而发生的?
非常感谢!
小智 9
拉动电源会导致一切停止飞行,没有任何警告。kill -9 对单个进程具有相同的效果,使用SIGKILL强制终止它。
如果一个进程被内核或断电杀死,它不会做任何清理。这意味着您可能有一半写入的文件、不一致的状态或丢失的缓存。由于日记、退出状态和备用电池,您通常不必担心任何这些。
如果 /tmp 中的临时文件在 tmpfs 中,它们将自动消失,但是您可能仍然有特定于应用程序的锁定文件需要删除,例如 firefox 的锁定和 .parentlock。
大多数软件都足够聪明,如果它没有记录成功的退出状态,就可以重试事务。典型的邮件系统就是一个很好的例子。如果消息正在传递,但在中间被切断,发送者将稍后重试,直到成功。
您的文件系统可能已被记录。如果您正在移动或写入文件并且它在中途死亡,则日志文件系统仍将引用原始文件。日志文件系统将非破坏性地进行更改,保留旧副本,然后在回收旧副本在磁盘上占用的空间之前仅引用新副本作为最后一步。
现在,如果您有一个 RAID 阵列,它就有各种内存缓冲区来提高性能并在断电时提供可靠性。您的文件系统很可能不知道设备中的缓存及其状态,因此它认为更改已提交到磁盘,但它仍在 RAID 缓存中的某处。那么当力量消亡时会发生什么?希望您的 RAID 设备中有一块可正常使用的电池并对其进行监控。否则,您的 fsck 文件系统已损坏。
是的,二进制文件中的一些位可能会损坏,但我不会在现代硬件上担心那么多。如果您真的很偏执,可以使用适当的工具监控磁盘和 RAID 的健康状况,但无论如何您都应该这样做。定期备份并获得不间断电源。
在意外关闭时,唯一应该损坏的文件是打开用于写入的文件。在任何给定时刻的大多数系统上,您可能不会写入文件。大概。
是 POSIX SIGKILL 并且依赖于实现。接收到这个信号的进程将没有机会处理它。
取决于硬件。磁头在驱动器动力下自动停放,写入缓存中的所有内容都会丢失 DRAM 刷新并在几秒钟内衰减到无法挽回的损坏。您的系统内存、CPU 缓存、寄存器等也会发生同样的情况。
来自 wdc.com(谷歌:site:wdc.com 防护头停车)
断电:硬盘驱动器被重置。头部使用主轴能量停在着陆区。主轴电机停止。
打开的文件未完全写出。如果打开文件进行写入,则会导致数据损坏。现代硬件中的文件写入速度很快,现代 PC 通常不会受到 IO 的压力。这就像蒙着眼睛走在安静的乡间小路上。大多数时候,你会没事的。
请参阅上文了解磁盘的作用。
查找日志文件系统,它们现在很正常:http : //en.wikipedia.org/wiki/Journaling_file_system
MS Word 或 vi 等软件将写入临时文件而不是原始文件。目标是永远不要让系统处于磁盘上没有一致副本的状态。
Windows 保留注册表的副本(这太重要了)维基百科:“Windows 2000 保留注册表配置单元 (.ALT) 的备用副本,并在检测到损坏时尝试切换到它”(此后我没有做过大量的技术支持) Win2k,所以我不确定 MS 的新机制是什么)
按难度排序(易-难)
保留备份是最合适的答案,好的备份应该能让你回到之前修改过的版本。
冗余电源?最终用户教育?将胶带和纸板放在电源按钮上?
如果没有硬件故障、磁盘驱动程序损坏、操作系统内核损坏、升级过程中缺少校验和或崩溃,二进制文件和库不会以读写方式打开,因此它们不会被损坏。它会发生,但很少见。
至于kill -9,这会向进程发送一个信号,让其当场“死亡”。该进程死亡(除非它处于不可中断的睡眠状态,在这种情况下它会变成僵尸)。没有文件被关闭,没有数据被写出,程序无法捕获此信号并执行其他操作。没有清理,什么也没有:它就死了。
如今的文件系统非常强大;像 XFS、JFS、ext3 和 ext4 这样的文件系统都有日志和其他东西来保持文件系统元数据的完整性。
像 Apache 本身和其他二进制文件不太可能因突然断电或系统终止而损坏,因为它们要么在内存中,要么正在被读取;如果正在读取它们(例如,Apache HTTP 正在启动),则电源浪涌可能会损坏二进制文件,但这似乎不太可能。
我有一台 Mac Mini,人们似乎喜欢关掉冷气(无论我告诉他们多少次......),而且它一直在继续。
在大多数情况下,只要您不依赖于kill -9或定期关闭电源,我就不会太担心。过去的情况要糟糕得多。我更担心(例如)Solaris 2.6,而不是 Solaris 10(等等)。