【问题标题】:NLog FileTarget on SSD slower than HDD in benchmark?SSD上的NLog FileTarget在基准测试中比HDD慢?
【发布时间】: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,要使基准测试有意义,您可能还需要确保按照stackoverflow.com/a/8248256/51685 中所述刷新所有记录器

标签: c# logging nlog hard-drive solid-state-drive


【解决方案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。

【讨论】:

    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2016-02-13
    • 2014-06-21
    相关资源
    最近更新 更多