我们有一个应用程序可以进行大量的日志记录。我们登录的介质是SLC SSD驱动器,但我们开始看到该领域的一些故障。我们可以关闭日志记录(我们这样做),有日志级别(我们有)但是有时工程师会打开日志记录来诊断故障并忘记将其关闭,这会导致SSD出现故障。
查看日志记录代码,我们将日志条目保存到队列中,每隔5秒,迭代集合并使用File.AppendAllText
将行写入文件。
根据MSDN,这写入文件然后关闭它。
用于实现相同功能但防止(或减少)对SSD的损害的更好的制度是什么?
在软件启动时打开FileStream
,在使用期间写入流并在软件退出之前关闭会更好吗?这将如何缓解磁盘级别的情况?涉及哪些流程以及如何比打开文件并立即关闭它更好。使用FileStream
'感觉'更好,但在做出改变之前我需要一个更具体的理由。
也许有一种更好的方式我们没有考虑过。
答案 0 :(得分:1)
如果您有足够的内存来保存日志消息,则排队并减少提交。 但问题是如果它失败了你就不会有最近的日志消息。
答案 1 :(得分:0)
这不是写入次数,而是写入的SSD页数。缓冲越多,物理写入越少,效果越好。
AppendAllText
附加一行是一种非常低效的方法。它会消耗大量CPU,因为必须为每一行打开和关闭大量对象和句柄。当更改变硬时,文件大小的每次更改都会导致NTFS日志刷新。
每五秒钟通过一次AppendXxx
调用写出所有数据,或者使用FileStream
构建类似的内容。你可以保持开放状态。这没关系。每五秒额外增加一个IO对于耐力来说毫无意义。
不可能比这更有效率。该方案以顺序方式写入最少量的数据。
考虑压缩你写的东西。