IIS,Web服务,负载均衡,工作进程,我们都一团糟

好吧,让我们开始说几件事。 我以这种方式configuration了一些东西,并采取了许多(未知的)步骤来达到这一目的,首先提高可靠性,然后再提高性能。

现在我们遇到了问题。

事实:

  • Windows 2003企业虚拟机(VMWare,我们无法访问VM控制台)
  • 8个CPU(他们是更新的XEON)
  • 16 GB的RAM(我相信12GB专用,rest是可爆的)
  • 24 GB的页面文件在自己的磁盘卷(所有磁盘是SAN,通过光纤连接)
  • 尽pipe一切基本上都是2.0,但已经达到.NET 4.0
  • 所有东西都用C#编写在ASMX Web服务中
  • 这是运行一个内部开发的应用程序“框架”,以支持离线数据收集/操作的连接不好的用户
    • 根据“上次同步date”收集数据并将其下载到本地SQL Express数据库
    • 用户可以离线编辑,然后在连接发送变更时备份
  • 除了“框架”应用程序池之外,每个应用程序都有自己的应用程序池
  • 我们有大约1700个用户分布在各个应用程序中,许多用户有多个应用程序
  • 大约400名“沉重”的用户使用多个应用程序
  • “框架”应用程序池有1个工作进程,应用程序1,应用程序2和应用程序3都有10个工作进程。
  • 应用程序4到6有1个工作进程
  • 应用程序1是一个24x7x365的应用程序,它必须始终在运行。
  • 应用1-3被configuration为每240分钟回收一次
  • 根据趋势数据,我们发现如果我们在一个小时内维持超过80-90个“同步”,则会有很多超时问题。
  • 似乎很多工作进程都没有做任何事情
    • 我觉得我们可以减less每个应用程序池大约4 WP
    • 在进程locking的早期,有很多问题。 除了这个之外,对于10个WP的理性也不是很确定,他们select了这个WP并且运行了相当长的一段时间
  • 在偷看时间的应用程序1,每小时超过50次同步,将迅速攀升至大约5.5 GB的内存。
    • 随着事情的发展,最终有些用户会得到“超时”错误
    • 我宁可看到每个2.5 GB(临时)的应用程序池的3个进程,而不是将所有内存都保存到自己的进程。
    • 这表明我只有一个进程正在处理请求。
  • 根据内存限制等,我们尝试了更频繁的回收。我们得到了更多的以下错误:
    • System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强制closures。
  • 我们已经有应用程序池1禁用(由于快速失败保护?)今年约3次,应用程序2已经发生过一次。

我们需要做的是控制整个混乱,更好地利用我们拥有的资源,如果可能的话尽快改善这个应用程序的平衡。

理想情况下,我认为我们需要转移到一个适当的负载均衡器和ASP.NET状态服务器的多服务器的情况。 我们确实可以访问我们现在可以使用的状态服务器,所以如果在整个工作进程中使用这个状态是有好处的,我们可以这样做。 另外还想提一下,添加服务器(甚至是虚拟的)并不是一个快速的过程(对于一个新的虚拟机来说,最less需要6周的时间),公司正在评估移动到一个新的数据中心,这样他们就会抵制设置任何东西新的,特别是如果它是一个物理系统。

我们在服务器上拥有pipe理员访问权限,除了重启服务器以外,还可以做我们需要做的开发人员/架构师。 我们必须获得特别许可/通知服务器监控组重新启动。

我承认这开始超出了我的知识,我们需要一些指导。 请提出尽可能多的问题,以便更好地了解我们正在进行的工作。 任何最佳实践或一般build议也是有帮助的。

如果需要,我可以提供有关Web服务之间的通信的更多详细信息。

编辑1:我应该解释一个通用的“同步”。 用户A连接到框架服务器进行authentication/logging。 然后根据需要连接到每个应用程序Web服务。 数据是从一系列来源(第三方WS,Oracle和SQL数据库,文件共享等)收集的,然后使用数据集传递给客户端。 在每个同步中有各种步骤(每个调用应用程序服务来完成工作和调用框架服务以进行logging),每个步骤对于应用程序都是唯一的。

听起来,可扩展性问题是在应用程序服务器而不是数据库服务器。 因此,最好的select是负载平衡应用程序服务器。

负载均衡非常简单,可以在networking层面完成。 这允许您将X数量的物理或虚拟机器放在VIP后面,并单方面将负载分配到机器上。 一个给定的用户将在每个请求中击中不同的机器。

当进行负载均衡时,最好避免会话状态信息。 但是,如果无法避免,则会需要所有计算机都可以连接到的会话状态服务器。 这在.NET中相当简单,因为可以使用Web.config轻松插入会话状态提供程序。 这使得应用程序服务器本身可以是无状态的,因此,VIP可以将传入的stream量导向任何想要的服务器。

如果负载平衡问题变得有问题或者需要部署维护,那么负载平衡还可以让机器停止服务。 这在部署过程中也派上用场,因为您可以将一半机器退出服务并进行部署,然后进行交换。 这可以防止有2个版本的应用程序代码同时运行。