【问题标题】:Best way to write logs to SSD将日志写入 SSD 的最佳方式
【发布时间】:2015-01-29 15:40:32
【问题描述】:

我们有一个执行大量日志记录的应用程序。我们登录的介质是 SLC SSD 驱动器,但是我们开始在现场看到一些故障。我们可以关闭日志记录(我们这样做),有日志级别(我们有),但是有时工程师打开日志记录以诊断故障并忘记将其关闭,这会导致一段时间后 SSD 出现故障。

查看日志代码,我们将日志条目保存到队列中,每 5 秒迭代一次集合并使用 File.AppendAllText 将行写入文件。

根据MSDN,这会写入文件然后关闭它。

什么是更好的机制来实现相同的功能,但防止(或减少)对 SSD 的损坏?

在软件启动时打开FileStream,在使用期间写入流并在软件退出前关闭会更好吗?这将如何缓解磁盘级别的情况?涉及哪些过程以及这比打开文件并立即关闭它更好。使用FileStream '感觉' 更好,但在进行更改之前我需要一个更具体的理由。

也许我们还没有考虑过更好的方法。

【问题讨论】:

  • SSD 的写入寿命有限。寻找不同类型的磁盘技术或其他品牌的 SSD。 pcworld.com/article/2043634/…
  • 我们出于其他原因使用 SSD,我们无法更改 100 多个系统。我们已经使用了我们认为最强大的 SSD 品牌(成本与质量)。我正在寻找一个答案,看看 .NET 如何写入驱动器以及该过程的机制。
  • 每 5 秒写入一次是每 5 秒写入一次。我不认为打开文件会是灵丹妙药。文件流写入磁盘。 MLC 的标称寿命为 10,000 次写入周期。每 5 秒只有 14 小时。
  • 糟糕。我的意思不是 SLC 不是 MLC
  • 即使在每 5 秒不到 60 天的 100 万个周期中。我希望你能用 .NET 修复一下,我会用普通驱动器上的数据库来解决这个问题。也许保留在内存中,每小时只记录一次。

标签: .net solid-state-drive disk-io


【解决方案1】:

如果您有足够的内存来保存日志消息,请减少排队和提交的频率。 但问题是,如果它出现故障,您将不会收到最近的日志消息。

【讨论】:

    【解决方案2】:

    这与写入次数无关,而与写入的 SSD 页数有关。缓冲越多,导致的物理写入越少越好。

    AppendAllText 追加一行是一种非常低效的方法。它会消耗大量 CPU,因为必须为每一行打开和关闭大量对象和句柄。文件大小的每次更改都会在更改变硬时导致 NTFS 日志刷新。

    每五秒用一次AppendXxx 调用写出所有数据,或者使用FileStream 构建类似的东西。你可以让它保持打开或不打开。没关系。每 5 秒增加 1 次 IO 对持久性毫无意义。

    没有比这更有效的了。该方案以顺序方式写入最少的数据。

    考虑压缩你写的东西。

    【讨论】:

    • 这就是我的想法,所以很高兴听到验证
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多