代码之家  ›  专栏  ›  技术社区  ›  Yaakov Ellis NevilleDNZ

为什么大容量插入会导致ASP.NET应用程序失去响应?

  •  0
  • Yaakov Ellis NevilleDNZ  · 技术社区  · 15 年前

    安装程序:ASP.NET 3.5,Linq to SQL。单独的Web和DB服务器(每个8核,8GB RAM)。4个数据库。我正在运行一个插入操作,在DB4中有几百万条记录(目前使用linq-to-sql,尽管我可能会切换到sqlbackcopy)。日志记录显示记录以每秒600-700的速度被一致地放入(我每1000条记录运行一次dataContext.SubmitChanges(),以减小事务大小)。插入在一个HTTP请求期间运行(超时设置非常高)。

    问题是,当此插入操作正在运行时,Web应用程序将 完全没有反应 (在我的计算机的不同浏览器窗口中,以及在远程位置的其他浏览器中)。

    此插入操作正在处理DB4中的一个表。大多数页面只接触DB1(所以我不认为这是一个锁定问题——我也通过ManagementStudio签入,没有不必要地锁定对象)。我已经检查了web和db服务器上的性能统计数据,虽然它们可能会不时地增加,但在插入过程中,它们始终保持在“绿色”范围内。

    你知道什么会导致这个应用失去响应,或者我应该做些什么来缩小这个问题吗?

    对建议的回应:

    • 建议插入使用所有DB连接:插入使用的连接字符串(和DB)与应用程序中的其他页面不同。另外,我签入了ssms,只有一个连接为db4打开,还有一个为db1打开(所以它看起来不像是在耗尽连接)。
    • 建议插入会使Web服务器上的CPU最大化:这是服务器上唯一的应用程序(一次少于5个用户)。性能监视器显示CPU保持在12%-20%之间。记忆很难被触动。
    5 回复  |  直到 15 年前
        1
  •  1
  •   Mitchel Sellers    15 年前

    我的第一个猜测是,您正在使用插入操作耗尽与数据库的可用连接,而Web应用程序正在等待与数据库的连接。

    你有几个选择。

    1. 在SSMS中查看在常规负载下打开和活动连接的情况,并在执行插入操作时查看这是否是问题。
    2. 使用分析工具(如ants profiler)查看减速时Web应用程序的情况,这可能有助于查明问题所在。
    3. 您还可以尝试在SQL服务器上手动执行Web应用程序正在使用的查询,并查看是否注意到类似的行为。

    另一个选项,可能性稍小,但它可能是执行大容量插入的Web应用程序,它占用了服务器上其他Web应用程序的所有CPU时间,阻止使用。如果您还没有这样做,请将应用程序拆分到自己的池中,以便监视其负载。

        2
  •  1
  •   Josh Pearce    15 年前

    我不知道LinqToSQL,但NHibernate特别指出,将其用于批量插入是一个坏主意。我发现ADO.NET中的数组绑定非常快, Here is an article 解释如何使用Oracle,但它也应该与其他供应商合作。

        3
  •  1
  •   Dmitry Osinovskiy    15 年前

    在Web应用程序中执行长时间操作似乎是个坏主意(例如,您的IIS服务器可以无理由地重新启动应用程序)。将长应用程序拆分为Web应用程序和服务应用程序。在服务应用程序中执行长时间操作。通过wcf&pipes在他们之间进行通信。

        4
  •  0
  •   Yaakov Ellis NevilleDNZ    15 年前

    最终解决方案 :我将数据插入从LinqToSQL更改为使用 SqlBulkCopy 通过DATABATE。第一次这样做时,我在试图构建一个内存中有200万行的数据表时遇到了一个内存不足的异常。因此,我一次添加50000行,并使用sqlblkcopy(批处理率:10000)将它们加载到数据库中,然后清除dataTable行集合。我现在在108秒内进入210万行(大约每秒20000行;昨晚的速率平均为每秒200行,L2s)。随着数据插入性能的提高,应用程序范围内的无响应性已经消失。

        5
  •  0
  •   MichaelT    15 年前

    在Web应用程序中,在将数据加载到数据库的整个过程中,阻塞一些重要信息的锁语句可能会重新出现。