【问题标题】:When can I host IIS and SQL Server on the same machine?什么时候可以在同一台机器上托管 IIS 和 SQL Server?
【发布时间】:2009-09-09 20:14:10
【问题描述】:

我了解到在同一台机器上安装 SQL Server 和 IIS 是不明智的,但我还没有看到任何证据。有没有人试过这个,如果有,结果如何?什么时候有必要将它们分开?是否需要任何调整?我特别关心 IIS7 和 SQL Server 2008。

如果有人可以提供数字显示何时使用两台机器更有意义,那将是最有帮助的。

【问题讨论】:

    标签: sql-server iis performance


    【解决方案1】:

    将 SQL Server 与 任何 其他产品(包括 SQL Server 的另一个实例)一起运行是不明智的。此建议的原因是 SQL Server 如何使用操作系统资源的性质。 SQL Server 在名为SQLOS 的用户模式内存管理和处理器调度基础结构上运行。 SQL Server 旨在以最佳性能运行,并假定它是操作系统上的唯一服务器。因此,SQL 操作系统为 SQL 进程保留机器上的所有 RAM,并为每个 CPU 内核创建一个调度程序,并为所有调度程序分配任务以运行,在需要时利用它可以获得的所有 CPU。因为 SQL 保留了所有内存,其他需要内存的进程会导致 SQL 看到memory pressure,并且对内存压力的响应会将页面从缓冲池中逐出,并将已编译的计划从计划缓存中逐出。而且由于 SQL 是唯一真正利用memory notification API 的服务器(有传言说下一个 Exchange 也会这样做),SQL 是唯一真正缩小以为其他进程腾出空间的进程(例如泄漏的错误 ASP 池)。 BOL 中也解释了这种行为:Dynamic Memory Management

    类似的模式发生在 CPU 调度中,其他进程从 SQL 调度程序中窃取 CPU 时间。在高端系统和 Opteron 机器上,情况变得更糟,因为 SQL 充分利用了NUMA 局部性,但没有其他进程通常不知道 NUMA,并且,尽管操作系统可以尝试保留分配的局部性,但它们最终会分配整个物理 RAM 并降低系统的整体吞吐量,因为 CPU 在等待跨 numa 边界页面访问时处于空闲状态。还有其他一些事情需要考虑,例如 TLB 和由于其他进程占用 CPU 周期而导致的 L2 未命中增加。

    所以总结一下,你可以用 SQL Server 运行其他服务器,但不推荐。如果您必须,请确保尽最大努力隔离两个服务器。为 SQL 和 IIS/ASP 使用 CPU 关联掩码以将两者隔离在不同的内核上,配置 SQL 以保留更少的 RAM 以便为 IIS/ASP 留下可用内存,配置您的应用程序池以积极回收以防止应用程序池增长。

    【讨论】:

    • @Remus Rusanu - 很多人都喜欢你的回答,包括我自己。很好的技术资料! :) 我认为答案通常取决于情况。由于简单、成本和资源在我们的情况下不需要分离,我们使用了单服务器技术。当这些要求发生变化时,我们也发生了变化,但这需要将近 8 年的时间。我认为许多中小型商店可能会遇到同样的情况。想法?
    • @klabranche:我提供的技术信息应该有助于配置混合服务器,以便在 SQL 和 IIS/ASP 之间尽可能地对内存、I/O 和 CPU 进行分区。从长远来看:IIS/ASP 可以轻松扩展,而 SQL 可以轻松扩展。因此,自然趋势是将 IIS/ASP 移到廉价商品硬件的农场或“花园”上,而 SQL 则单独留在组织拥有的最大机器上。
    • @Remus Rusanu - 我同意。您是否同意对于中小型商店/应用程序而言,单服务器情况不一定是一个坏方法?
    • 有时你必须使用你收到的牌。但是恕我直言,任何以网络存在为生的专卖店都应该将两者分开。
    • 如果系统负载低并且 web(或中间撕裂)代码向 sqlserver 发出大量小请求,由于延迟较低,您甚至可以更快地在同一台服务器上运行所有内容通过没有网络的开销来获得。
    【解决方案2】:

    是的,这是可能的,很多人都这样做了。

    这往往是一个安全和/或性能问题。
    安全性受到质疑,因为您的攻击面在兼具两者的盒子上增加了。也许对你来说不是问题。

    性能受到质疑,因为现在您的服务器正在处理 Web 和 DB 请求。同样,在您的情况下可能不是问题。

    测试与生产....

    许多人可能在测试环境中感觉良好,但在生产环境中却不是......

    再次,您的团队的电话。我希望我的测试和生产环境尽可能相似,但这是我的偏好。

    【讨论】:

    • 我相信 hanselminutes 第 134 集和/或第 135 集显示 SO 正在一台服务器上运行。绝对可行,尽管斯科特对这个想法有点害怕。 :)
    【解决方案3】:

    有可能,是的。

    生产环境的好主意,不。

    您将遇到的问题是,在大量负载下的 SQL Server 数据库很可能会执行繁重的磁盘 I/O 并占用大量内存。这种组合会占用机器,并且当 IIS 尝试提供页面时,您会看到性能下降。

    【讨论】:

      【解决方案4】:

      在某些情况下这是不明智的……在其他情况下完全是明智的。

      如果您的机器未充分利用并且不会承受重负载,那么将数据库安装在同一台机器上会有好处,因为您根本不必通过网络传输任何内容。

      另一方面,如果 IIS 或数据库中的一个或两个负载过重,它们可能会开始干扰,并且每个专用硬件的性能增益可能会超过必须检查的损失网络。

      【讨论】:

        【解决方案5】:

        不要忘记维护问题...如果不对另一个进行核对,您将无法重新启动/修补一个。如果它们在两个盒子上,您可以为您的用户提供更好的体验,而不是在您维护 SQL 盒子时没有来自网络服务器的响应。

        在列表中不是最高的,但应该注意。

        【讨论】:

          【解决方案6】:

          你当然可以。例如,如果您拥有庞大的用户群,或者如果对数据库运行大量繁重的查询,您将遇到性能问题。我曾在几个站点工作过,通常托管在 1and1,这些站点在同一个机器上运行 IIS 和 SQL Server(Express!),数千个用户(数百个并发)和数百万条设计不良的表中的记录,通过编写不良的存储过程和用户体验当然是可以忍受的。这一切都归结为您计划访问服务器的难度。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-06-21
            • 2016-04-01
            • 1970-01-01
            • 2018-05-01
            • 2011-04-11
            • 2017-06-25
            • 1970-01-01
            相关资源
            最近更新 更多