.net - 诊断磁盘I/O瓶颈?

标签 .net multithreading performance log4net-appender

我在装有6个Xeon内核的VDI中运行的Windows 2008服务器R2上安装了.NET服务。在发生此问题的过程中,此服务的CPU使用率平均约为10-20%,尽管数据库超时间歇性地发生。

我的应用程序确实是包装盒上唯一的东西,CPU使用率使我相信以下内容不是CPU瓶颈或时间/切片问题。

我们使用log4net进行日志记录

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <File value="C:\app\service.log" />
      <AppendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date{yyyy-MM-dd hh:mm:ss:fff} %-5level %logger - %message%newline" />
      </layout>
    </appender>

我将以下代码删除了长时间运行的实际片段
DateTime mst = DateTime.Now;

//...really long running code

DateTime st = DateTime.Now;

//...more long running code

DateTime et = DateTime.Now;
LogHelper.LogMessage("REGISTRATION: " + subscriber.Principal.Identity.Name + " packaging complete in " + (et - st).TotalMilliseconds + "ms");

et = DateTime.Now;
LogHelper.LogMessage("REGISTRATION: " + subscriber.Principal.Identity.Name + " Registration complete in " + (et - mst).TotalMilliseconds + "ms");

通常我得到以下日志条目
2013-07-15 07:00:02:238 DEBUG (T:118)Register - REGISTRATION: CORP\user packaging complete in 15.6001ms
2013-07-15 07:00:02:238 DEBUG (T:118)Register - REGISTRATION: CORP\user Registration complete in 1294.8083ms

但是今天我得到了以下
2013-07-15 11:35:02:498 DEBUG (T:70)Register - REGISTRATION: CORP\user packaging complete in 12589.2807ms
2013-07-15 11:35:04:386 DEBUG (T:70)Register - REGISTRATION: CORP\user Registration complete in 56768.7639ms

在查看时间戳时,两个日志条目的间隔为1888ms,比正常执行的整个持续时间更长。
  • 如何测量这是否实际上是由磁盘I/O瓶颈引起的?
  • 还有什么能解释通常在我得到0的日志条目之间花费的1888毫秒?

  • 我正在考虑使用implementing this solution帮助消除I/O的可能原因。

    最佳答案

    我们最终使用Red-Gate的ANTS配置文件来识别服务“软重启”(处置/重新分配对象)过程中的内存泄漏。正常的操作流程没有问题,内存配置文件平坦,健康状况良好。

    只有引入了一个计时器来模拟一系列导致软重启的意外问题之后,我们才能够识别出数量不断增加的挥之不去的对象,并重现该问题,从而导致大量内存使用和可怕的页面错误,并降低了性能。

    我的理论是,所有对磁盘的分页都会影响我们写入日志文件的能力以及分配新对象的能力。

    关于.net - 诊断磁盘I/O瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17665246/

    相关文章:

    union 访问成本与使用基本类型

    c# - ServiceStack:如何处理错误?

    c# - 隐藏静态方法可以吗?

    java - Java中的多线程死锁

    java - Executors.newSingleThreadExecutor() - 如何查看队列中有多少任务

    c# - 实现索引队列的有效方法(可以在 O(1) 时间内通过索引检索元素)?

    android - ORMLite 创建或更新似乎很慢 - 正常速度是多少?

    javascript - Knockout JS - 修改 observableArray 中项目的属性

    c# - 使用 * 通配符时 Lucene .net Boost 不工作

    c++ - 如何安全地删除 ATL DLL 中的 std::thread