Azure App Service Plan临时存储耗尽排查求助
排查Azure App Service临时存储占用不匹配问题
1. 排查已删除但被进程锁定的文件
Windows系统中,已删除但被进程占用的文件不会立即释放磁盘空间,这类文件无法通过普通文件统计命令捕获。可通过以下PowerShell命令在Kudu中排查:
# 枚举持有已删除临时目录文件句柄的进程 Get-WmiObject Win32_Process | ForEach-Object { $proc = $_ $proc.GetOwner() | Out-Null $owner = "$($_.Domain)\$($_.User)" Get-WmiObject Win32_OpenFile | Where-Object { $_.ProcessId -eq $proc.ProcessId } | ForEach-Object { if ($_.FileName -match 'C:\\local|D:\\local') { [PSCustomObject]@{ ProcessId = $proc.ProcessId ProcessName = $proc.Name Owner = $owner LockedFile = $_.FileName } } } } | Format-Table -AutoSize
找到对应进程后,可尝试重启单个App Service释放句柄,无需全量重启所有服务。
2. 验证SCM分离导致的存储隐藏
虽然WEBSITE_DISABLE_SCM_SEPARATION为legacy模式,但可在单个测试服务上临时验证:
- 进入目标App Service的「配置」→「应用程序设置」,添加
WEBSITE_DISABLE_SCM_SEPARATION并设为true - 重启服务后,重新执行原存储统计脚本对比用量
- 验证完成后立即移除该设置,避免影响生产环境稳定性
3. 排查遗漏的临时存储目录
检查环境变量指向的临时目录
部分服务的临时文件可能写入%TEMP%环境变量指向的路径,而非固定的D:\local\Temp:
# 查看当前服务的TEMP路径 echo $env:TEMP # 统计该路径的存储占用 [math]::Round((Get-ChildItem -Path $env:TEMP -Recurse | Measure-Object -Property Length -Sum).Sum / 1GB, 2)
检查日志目录堆积
部分服务会将日志写入C:\local\Logs等子目录,可单独统计该目录占用:
[math]::Round((Get-ChildItem -Path C:\local\Logs -Recurse | Measure-Object -Property Length -Sum).Sum / 1GB, 2)
4. 机器级存储明细排查
同一App Service Plan下的所有服务共享机器级临时存储,若上述方法无法定位,可通过以下方式获取机器级明细:
- 进入「Azure App Service Diagnostics」→「Advanced Tools」→「Process Explorer」,查看机器级文件占用情况
- 若权限不足,提交Azure支持工单,请求后台查看机器级存储的具体文件分布
临时缓解与长期方案
- 临时缓解:定位到占用异常的服务后,单独重启该服务释放资源,无需调整Plan或全量重启
- 长期方案:
- 禁止向临时目录写入持久化数据,改用Blob Storage等持久化存储方案
- 配置日志轮转策略,避免日志文件无限堆积
- 添加启动任务定期清理临时目录(需注意避免删除正在使用的文件)
内容的提问来源于stack exchange,提问作者Dragomir Donkov
相关产品推荐
相关产品推荐

