我们为客户提供了一个相当大的(自编)ASP.NET网站.它由一个Web服务,一个Web站点和一个提供图像的Web站点组成,这三个站点都位于自己的虚拟目录中.三个虚拟目录在一个应用程序池中.池具有设置为500兆字节的内存限制(最大虚拟内存和最大已用内存).
但是,即使一次只有一个用户,应用程序池也会遭受很多回收.事件日志消息说:
进程ID为"xxxx"的工作进程为应用程序池"xxxx"提供服务已请求回收,因为它已达到其虚拟内存限制.
但是,使用Process Explorer观察工作进程不会显示任何支持此消息的内容.我应该观察哪些计数器来观察实际上受两种设置限制的内存?
更新1
在任务管理器中观察该过程会显示大约100 MB的"内存使用情况"和"虚拟机大小",仍然会使用上述消息回收该过程.服务器上可用的5 GB物理内存...
更新2
虽然网站相当大,但问题集中在应用程序的一小部分.它执行查询(使用Oracle)并将结果绑定到gridview和转发器webcontrol.结果包括简短描述和图标(通过图像服务网站加载).如果我在彼此之后执行10个搜索操作,每个搜索操作给出9个结果,则工作过程显示内存使用情况和大小为100 MB的vm大小并且回收...
更新3 切换图像服务网站的使用不会产生更好的结果.所以我认为这个问题是另一回事是公平的.
我们使用Kentico CMS,我与他们交换了关于网络花园部署的电子邮件.
我们在具有8个CPU核心的服务器上运行单个站点.在与Kentico的咨询热线,我们没有改变应用程序池Web园从默认即它被设置为1的工作进程的最大数设定.
我们的经验是,该网站只使用其中一个cpu核心 - 其他人都闲置.当我通过电子邮件向他们发送电子邮件时,他们的回答是操作系统/ IIS会处理此问题并根据需要使用其他核心,即使应用程序池只有一个工作进程.
现在,我非常尊重Kentico的人,但这对我来说似乎不对?
当然,如果我们想要使用所有核心,我们需要允许八个工作进程(并在SQL服务器中实现会话状态存储)?
非常感谢
托尼
我一直想知道,假设你有两个运行在同一个应用程序池中的asp.net网站.
让我们称他们为网站1和网站2
这两个网站都引用了一些共享代码,我们称之为Awesome.dll
让我们说Awesome.dll包含一个如下定义的类
public static class Foo
{
public static string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
这两个网站是否共享相同的静态类,还是拥有自己的隔离副本?也就是说,如果网站1对Foo.Bar进行了更改,该更改是否反映在网站2中?
我有一个在具有多个工作进程的应用程序池中运行的应用程序.
我需要访问控制器中的进程ID来检查自从我更改应用程序池以使用多个工作进程后出现的一些问题.
Application_End() 在我的应用程序池停止时调用,这可能由于多种原因而发生,包括自动池回收或从中提供应用程序的文件夹中的更改.
调用堆栈通常如下所示:
my Application_End(Object sender, EventArgs e)
at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at System.Web.HttpApplication.InvokeMethodWithAssert(MethodInfo method, Int32 paramCount, Object eventSource, EventArgs eventArgs)
at System.Web.HttpApplication.ProcessSpecialRequest(HttpContext context, MethodInfo method, Int32 paramCount, Object eventSource, EventArgs eventArgs, HttpSessionState session)
at System.Web.HttpApplicationFactory.Dispose()
at System.Web.HttpRuntime.Dispose()
at System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(Object state)
at …Run Code Online (Sandbox Code Playgroud) 模块IIS Web核心
通知未知
处理程序尚未确定
错误代码0x8007000d
配置错误无法解密属性"密码"
配置文件不可用(配置隔离)
当我运行我的应用程序即时收到此错误,我找不到任何解决方案,请帮助?
在ASP.NET中,当您修改web.config文件时,IIS将回收应用程序池.现在,我将我的配置存储在DB而不是web.config中,并希望模拟类似的行为.我目前的解决方案是调用HttpRuntime.UnloadAppDomain().
MSDN上的描述说:
Terminates the current application. The application restarts the next time a request is received for it.
Run Code Online (Sandbox Code Playgroud)
我的问题是:它是否突然终止所有飞行中的请求?如果没有,那么在appdomain重新加载期间到达的请求会发生什么?或者重装时间微不足道?
我试着环顾四周,但找不到任何有关此事的信息.
谢谢 :)
我想通过我的应用程序回收应用程序池.
以前我将应用程序池名称存储在我的数据库中并使用它来回收.但过去我们将应用程序从一个应用程序池移动到另一个应用程序池,有时我们忘记更新数据库中的应用程序池名称.
所以我想通过应用程序获取应用程序池名称并将其用于回收.
为 IIS Asp.NET Core 应用程序池设置“无托管代码”.NET CLR 版本有什么意义?
文档说
ASP.NET Core 在单独的进程中运行并管理运行时。ASP.NET Core 不依赖于加载桌面 CLR。将 .NET CLR 版本设置为无托管代码是可选的。
既然它是可选的,那么保留默认的v4.0 有什么缺点?为什么文档明确指示将其设置为“无托管代码”?目前还不清楚这个特定配置是否存在性能问题。
我的应用程序池一直使用 OnDemand 启动模式,但最近我听说 AlwaysRunning 模式,它允许部署到 IIS 的 ASP.NET 应用程序在部署后立即可用。启用此功能似乎会导致 IIS 在部署应用程序后立即启动应用程序,从而消除 \xe2\x80\x9ccold 命中 \xe2\x80\x9d 到网站所需的预热时间。这篇精彩的文章对此进行了解释。
\n下面是我有一些疑问并且想了解一下:
\n使用 AlwaysRunning 功能,回收应用程序池时\n会发生什么情况?使用的内存被删除并释放?工作进程\n被终止并再次启动,或者它们在内存中继续可用,并且它们使用的内存没有被删除和释放?
\nOnDemand 和\nAlwaysRunning 的优点和缺点是什么?哪个更适合单个工作进程,哪个更适合网络花园(多个工作进程)?
\n另外,有人可以解释一下将\nAlwaysRunnig 与进程空闲超时和空闲\n超时操作和回收结合使用时网站的行为吗?点播也是如此。我想\n清楚地了解所有这些部分在这些场景下如何相互干预\n(AlwaysRunning 和 OnDemand)。
\napplication-pool ×10
iis ×8
asp.net ×4
.net ×2
asp.net-mvc ×2
c# ×2
asp.net-core ×1
clr ×1
config ×1
encryption ×1
iis-6 ×1
kentico ×1
unmanaged ×1
web-garden ×1