SSD上的NLog FileTarget在基准测试中比HDD慢?
Posted
技术标签:
【中文标题】SSD上的NLog FileTarget在基准测试中比HDD慢?【英文标题】:NLog FileTarget on SSD slower than HDD in benchmark? 【发布时间】:2021-10-09 09:27:10 【问题描述】:Method | storage | loggingFramework | Mean | Error | StdDev | Rank | Gen 0 | Gen 1 | Gen 2 | Allocated |
---|---|---|---|---|---|---|---|---|---|---|
LogInfo | HDD | Nlog | 317.5 ns | 68.74 ns | 3.77 ns | 1 | 0.0196 | 0.0067 | - | 149 B |
LogInfo | SSD | Nlog | 321.3 ns | 221.72 ns | 12.15 ns | 2 | 0.0191 | 0.0067 | - | 145 B |
LogInfo | RamDisk | Nlog | 326.7 ns | 72.90 ns | 4.00 ns | 3 | 0.0200 | 0.0072 | - | 152 B |
LogInfo | RamDisk | Log4Net | 6,246.7 ns | 330.27 ns | 18.10 ns | 4 | 0.0305 | - | - | 216 B |
LogInfo | HDD | Log4Net | 7,874.0 ns | 20,773.26 ns | 1,138.65 ns | 5 | 0.0305 | - | - | 216 B |
LogInfo | SSD | Log4Net | 8,360.2 ns | 26,805.20 ns | 1,469.28 ns | 6 | 0.0305 | - | - | 216 B |
[Benchmark]
public void LogInfo()
//for (int i = 0; i < 100; i++)
//
Logger.Info(depthMessage);
//
问题不清楚,因为我是日志框架的新手。显然,日志没有直接写入磁盘,导致基准测试失败。我无法删除问题。我在这里分享我的配置。
<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="false" >
<variable name='globalLevel' value='info'/>
<variable name="LogDay" value="$date:format=yyyyMMdd"/>
<variable name="LogHour" value="$date:format=yyyyMMdd-HH"/>
<variable name="LogHour" value="$date:format=yyyyMMdd-HH"/>
<variable name="shortlogtime" value="$date:format=HH\:mm\:ss.fff"/>
<targets>
<target name="SSDRollingFileAppender" xsi:type="File" fileName="c:\Nlog\$LogDay.log"
layout="$shortlogtime$message"
maxArchiveFiles="100"
archiveAboveSize="5368709120"
archiveNumbering="Sequence"
concurrentWrites="false"
keepFileOpen="true"
archiveFileName="c:\Nlog\$LogDay.##.log"
/>
<target name="HDDRollingFileAppender" xsi:type="File" fileName="d:\Nlog\$LogDay.log"
layout="$shortlogtime$message"
maxArchiveFiles="100"
archiveAboveSize="5368709120"
archiveNumbering="Sequence"
concurrentWrites="false"
keepFileOpen="true"
archiveFileName="d:\Nlog\$LogDay.##.log"
/>
<target name="RamDiskRollingFileAppender" xsi:type="File" fileName="e:\Nlog\$LogDay.log"
layout="$shortlogtime$message"
maxArchiveFiles="100"
archiveAboveSize="5368709120"
archiveNumbering="Sequence"
concurrentWrites="false"
keepFileOpen="true"
archiveFileName="e:\Nlog\$LogDay.##.log"
/>
</targets>
<rules>
<logger name="SSD" minlevel="$globalLevel" writeTo="SSDRollingFileAppender" final="true" />
<logger name="HDD" minlevel="$globalLevel" writeTo="HDDRollingFileAppender" final="true" />
<logger name="RamDisk" minlevel="$globalLevel" writeTo="RamDiskRollingFileAppender" final="true" />
</rules>
</nlog>
【问题讨论】:
比什么好? 您可以看到 Nlog 的 HDD 和 SSD 之间没有太大区别。所以为什么?谢谢 你如何测试这个?您是否确保数据也被刷新到磁盘? 您始终需要小心测量的内容。您可能正在测量写入某个缓冲区的时间。另外,实际问题是什么? SSD 通常比旋转磁盘具有更好的性能,但如果日志记录是性能瓶颈,您可能需要其他修复。 对于 Nlog,要使基准测试有意义,您可能还需要确保按照***.com/a/8248256/51685 中所述刷新所有记录器 【参考方案1】:NLog FileTarget 默认使用handbreak pulled 运行。请为 NLog FileTarget 配置这些设置并再次运行您的基准测试:
KeepFileOpen = true ConcurrentWrites = 假另见:https://github.com/NLog/NLog/wiki/Performance#file-logging-performance
附:如果你想要真正快速的性能,那么你也应该启用AsyncWrapper,但remember to flush 并且还要注意默认情况下overflowAction = Discard。
【讨论】:
以上是关于SSD上的NLog FileTarget在基准测试中比HDD慢?的主要内容,如果未能解决你的问题,请参考以下文章
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil