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

国际权威AI基准测试公布最新榜单,浪潮AI服务器再攀新高!

C++ 中的 HDD 基准测试 - 测量的传输速度太快

基准测试:PostgreSQL 上的 bigint 与 int

Unity在WebGL平台上的性能基准测试

SDK 上的 Jetson Nano 图像基准测试