java - 从繁忙的 Java Web 应用程序插入 30,000 个用户后,SQL Server 2008 变慢

标签 java sql sql-server-2008 tomcat

我们的一个系统最终投入生产,在高峰时段(任何时候约有 200 个并发用户),流量可以在一小时内增加到 30,000 个用户交易。

我们注意到一个奇怪的行为,即在我们的 SQL 服务器重新启动后,性能非常快。即使一开始有200个并发用户,到SQL server 2008 R2的事务也不到10ms。然而,在大约 15,000 笔交易之后,我们可以看到每笔交易可能需要 100 毫秒才能完成。当涉及到大约 30,000 个事务时,每个事务最坏的情况可能需要 300ms。如果我们不重启 SQL 服务器,即使是单线程,事务仍将在 300 毫秒左右。

每笔交易将执行以下操作:

  • 1 在主表中选择和 2 在帐户表中选择,1 插入或更新主表,1 插入或更新帐户表,1 或 2 插入历史表
  • 账户表(2列作为主键,4列作为索引,另外6列作为数据列)
  • 主表(3列为主键,5列索引,11列数据)
  • 历史表(3列作为主键,4列作为索引,另外15列作为数据列)

注意:上面的某些数据列是索引上面是因为我们在where子句中使用了。

注意:在 Select 期间,我们不会出于性能目的连接任何表。

注意:DB Server和Web Server其实是同一个服务器。

系统设置:

  • 操作系统:Windows 2008 企业版
  • 网络服务器:Tomcat 网络服务器
  • 与数据库的连接:Spring 连接池(最小 50,最大 350)
  • 使用最新的 SQL JDBC 驱动程序
  • 数据库服务器:SQL Server 2008 R2 SP1

服务器硬件:

  • CPU:4 x 四核 CPU(每个核心有 2 个线程),即总共 32 个物理线程
  • 内存:16GB
  • 硬盘:RAID 1 在 4 个 SAS 15K 硬盘上。这意味着 2 个硬盘对操作系统可见。应用程序数据和操作系统使用一个硬盘,而 SQL DB 使用另一个硬盘。

知道我们可以在哪里跟踪和解决 10,000 次交易后性能下降的问题吗?

最佳答案

原来硬盘Raid配置有误。与在这里选择 SQL/Oracle 无关,罪魁祸首是“Raid 1”配置。

我们延迟实际启动日期并在 Raid-0 上用两个硬盘重新测试,似乎 SQL 服务器的速度要好得多(快 30%)并且更加一致。此外,我们将硬盘重新格式化为 SQL MVP 推荐的 64k 簇大小。

我们最终在生产环境中将 6 个硬盘配置为 Raid 1-0,它运行得非常出色!

问题解决了!

关于java - 从繁忙的 Java Web 应用程序插入 30,000 个用户后,SQL Server 2008 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3673330/

相关文章:

sql-server - 对数据库中的项目符号进行排序

sql-server - SQL Server备份脚本

sql - 为什么 ActiveRecord 会为大多数操作生成参数化查询,但不会为 find_by 生成参数化查询?

sql - 在 t-SQL 中将值与 NULL 进行比较

Java Jersey 找不到资源

java - 保存 xml 对象,以便元素在保存的 xml 文件中按排序顺序排列

php - 如何通过android以表格格式显示访问另一个类中的微调器选定值

sql - 打印当前月份的行,然后是一年中剩余的月份

java - 如何在 Java parallelStream 中使用 print ("\r"+progressMessage)?

java - 可能的正则表达式回溯问题?