我们有一个应用程序可以进行大量的日志记录。我们登录到的介质是SLC SSD驱动器,但是我们开始在这个领域看到一些故障。我们可以关闭日志(我们需要),有日志级别(我们有),但是有时工程师会打开日志来诊断一个故障并忘记关闭它,这会导致SSD在一段时间后失败。
查看日志代码,我们将日志条目保存到队列中,每5秒进行一次迭代,并使用File.AppendAllText
将行写入文件。
根据MSDN,这会写入文件,然后关闭它。
除了防止(或减少)对SSD的损害外,还有什么更好的制度来实现同样的功能呢?
是否最好在软件开始时打开一个FileStream
,在使用时写到流,然后在软件退出之前关闭?这将如何缓解磁盘级的情况?所涉及的进程是什么,这比打开文件并立即关闭它更好。使用FileStream
感觉更好,但在进行更改之前,我需要一个更具体的理由。
也许还有更好的方法我们还没有考虑过。
发布于 2014-12-02 13:45:06
这与其说是写的数量,不如说是写的SSD页面的数量。缓冲区越多,物理写入越少,结果越好。
添加一行的AppendAllText
是一种非常低效率的方法。它消耗了大量的CPU,因为每一行都必须打开和关闭大量的对象和句柄。每次更改文件大小都会导致NTFS日志刷新,当该更改变硬时。
每隔5秒钟用一个AppendXxx
调用写出所有数据,或者使用FileStream
构建类似的数据。你可以把它打开也可以不开。无所谓。每5秒增加一次IO对耐力来说是毫无意义的。
没有比这更有效率的了。该方案以顺序方式写入最小数据量。
考虑压缩你写的东西。
发布于 2014-12-02 13:33:05
如果您有足够的内存来保存日志消息,那么队列和提交次数就会减少。但问题是,如果它下降了,您将不会有最近的日志消息。
https://stackoverflow.com/questions/27231691
复制相似问题