2

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

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

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

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

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

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

4

2 回答 2

1

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

于 2014-12-02T13:33:05.237 回答
0

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

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

AppendXxx每五秒通过一次调用写出所有数据,或者使用FileStream. 你可以让它保持打开或不打开。没关系。每 5 秒增加一个 IO 对持久性没有意义。

不可能比这更有效率。该方案以顺序方式写入最少量的数据。

考虑压缩你写的东西。

于 2014-12-02T13:45:06.660 回答