如何检查上次回收的应用程序池

Posted

技术标签:

【中文标题】如何检查上次回收的应用程序池【英文标题】:How to check app pool last recycled 【发布时间】:2012-01-20 15:13:45 【问题描述】:

是否可以检查我上次回收应用程序池的时间,我想检查我的应用程序池上次回收的日期,在 IIS 中有什么我可以获取此信息。

【问题讨论】:

将日志记录语句放入 Global.asax 的 Application_Start 中,即以编程方式。如果您无法访问代码,事件查看器将是一个不错的查看位置。This article 解释如何设置应用程序重启事件日志 我询问了similar question,如果您处于无法访问事件日志的共享托管环境中,这可能会很有用。 【参考方案1】:

如果启用了循环记录登录,您可以在事件查看器(系统日志)中看到这一点。

如果不是,您可以使用 PerfMon 计数器查看 W3WP.exe 上代表您的应用程序池的 Process-Elapsed Time(这将是自上次回收以来的秒数)

【讨论】:

事件查看器在哪里? Application 日志? System 日志?其他地方? 开始菜单 (Windows) > “事件查看器” 如何检查登录是否开启回收?【参考方案2】:

在 Powershell 中:

(ps -id (Get-IISAppPool -Name <name>).WorkerProcesses.ProcessId).StartTime

如果池已经被回收,那么由于某种原因你可能需要重新导入模块来获取新的processId:

$pool = Get-IISAppPool -Name <name>

$pool.recycle()

Import-Module -Force IISAdministration

(ps -id (Get-IISAppPool -Name <name>).WorkerProcesses.ProcessId).StartTime

【讨论】:

好,要转义 app_pool 名称只需用单引号括起来【参考方案3】:

获取工作进程正常运行时间(推荐):

$poolName = <your pool name goes here eg. DefaultPool>
$poolProcess =(gwmi -NS 'root\WebAdministration' -class 'WorkerProcess' | select AppPoolName,ProcessId | Where-Object  $_.AppPoolName -eq $poolName  )

$lastStartTime=(Get-Process -Id $poolProcess.ProcessId).StartTime
write-output $lastStartTime

要使其正常工作,请确保您已启用“IIS 管理脚本和工具”。

其次,如果启用,方法是使用事件日志

Get-Eventlog -LogName system -Newest 1 -Source "WAS" -Message "*recycle of all worker processes in application pool '$poolName'*")

使用Get-Eventlog,您可以使用-After/-Before 参数来进一步限制结果。

要检查应用程序池是否在最后 'X' 分钟内被回收,可以使用以下 powershell sn -p:

function isRecycledInLastNMinutes($appPoolName, $lminutes)
    $beforeDate = Get-Date -format 'u'
    $afterDate = $beforeDate.addMinutes(-$lminutes)
    $result = (Get-Eventlog -LogName system -Newest 1 -Source "WAS" -After $afterDate -Before $beforeDate -Message "*recycle of all worker processes in application pool '$appPoolName'*")
    if( $result.length -eq 1)
        return $true
    else
        retrun $false
    

【讨论】:

【参考方案4】:

要使用一条命令获取所有信息,请使用 Get-WmiObject 而不是 get-process。

Get-WmiObject Win32_Process -Filter "name = 'w3wp.exe'" | Select-Object Name, @"name"="ApplicationPool";expression=(($_).CommandLine).split('"')[1] ,@"name"="Starttime";expression=$_.ConvertToDateTime($_.CreationDate)

【讨论】:

【参考方案5】:

这将为您提供机器上所有 w3wp 进程及其启动时间的列表。如果没有启动网站并因此不存在 w3wp 进程,ErrorAction 可防止命令行开关引发错误

ps w3wp -ErrorAction SilentlyContinue | select ProcessName, StartTime

在带有 powershell v4.0 的 Server 2012 R2 上测试

【讨论】:

【参考方案6】:

您可以使用这个powershell sn-p轻松找到最新的回收时间:

(Get-Process -Id <ProcessId>).StartTime

因此,在任务管理器中找到您的 Web 应用程序的进程 ID。 首先通过 Tools > Select columns... 添加以下列:选择 PIDCommand Line。 查找任何 w3wp.exe 进程并通过检查命令行找到您的应用程序(应用程序池名称是其中的一部分)并记下其 PID。 然后运行powershell脚本查找最新的回收时间:

希望对你有帮助

【讨论】:

找到进程 ID 的替代方法是使用 IIS 管理单元,并说:dir IIS:\AppPools_APPNAME_\WorkerProcesses。 别忘了以管理员身份运行 Powershell 作为单行者:ps w3wp | select ProcessName, StartTime 在 PS v4 上。 ps w3wp | select ProcessName, Id, StartTime | ft -AutoSize 也显示进程的ID 谢谢大家,我用它来确定回收导致我们的一个应用程序池在启动后大约 3 小时内无响应。错误出现在 w3wp.exe 和模块 ntdll.dll 上,发现它是因为我们在夜间监控服务器资源时抓取压力测试数据并看到一个巨大的下降,一旦回收完成(或达到之前的空闲超时)就会返回。解决方法是简单地禁用回收,或设置为不影响客户端的特定时间。

以上是关于如何检查上次回收的应用程序池的主要内容,如果未能解决你的问题,请参考以下文章

为啥还要回收应用程序池?

如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响

如何在事件日志中查找应用程序池回收

如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?

人们在部署大型应用程序时如何解决应用程序池回收问题?

如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?