问题场景:Server 2008 R2,系统盘剩下1M空间,业务不可用。
解决过程:
定位到C:/Windows/SysWOW64占用了34.5G,而正常系统该文件夹只有1G左右
进入SysWOW64逐层定位,最终定位到是
C:/Windows/SysWOW64/config/systemprofile/AppData/Local/Microsoft/Windows/Temporary Internet Files这个文件夹,系统缓存目录里面小文件太多,有几百万个,一双击文件夹,系统立马崩溃,试过重启系统,缓存仍然异常。
系统盘剩余空间只有1M,想用360强力删除之类的工具软件是不可能了,谁事先会想到在系统里放个这样的工具呢,这种情况下只能考虑“万能删除.bat”了,里面就2句命令。
在记事本里写上这两句另存为.bat格式的,然后把
C:/Windows/SysWOW64/config/systemprofile/AppData/Local/Microsoft/Windows/Temporary Internet Files这个文件夹用鼠标拖到“万能删除.bat”的图标上,然后耐心等着就行。
Ctrl E打开资源管理器(我的电脑、计算机),过几分钟刷新下会看到系统盘剩余空间在逐渐增大。
30多G,几百万个小文件清理了好几个小时才结束。不过,最终还是完美解决了问题。
类似的问题,之前还遇到1次,服务器上IIS站点100多个,每个都特别卡,但查看服务器监控,各项指标均正常。
于是进系统放开php.ini中的display_errors = On让显示报错信息,然后随机选择一个站点打开“http://localhost/”访问看报错如下图
PHP Notice: Undefined offset: 0 in D:/web/www/libs/classes/common_08cms/envbase.cls.php on line 217
PHP Fatal error: Maximum execution time of 30 seconds exceeded in D:/web/www/include/general.inc.php on line 60
第一句是个notice告警级别很低可以忽略,第二个是致命错误,D:/web/www/include/general.inc.php第60行超时,于是打开代码定位第60行发现是C:/Windows/Temp缓存目录,经验猜测估计是缓存目录小文件太多了,操作系统光遍历一遍这个目录都够累的了,而且IIS中有100多个站点。
代码中已经明示跟C:/WINDOWS/Temp有关了,于是去定位C:/WINDOWS/Temp,结果卡得根本进不到文件夹中去,右键查看属性有214万多个文件。
214万多个文件,这是在C:/Windows/Temp文件夹上右击查看属性,这样比较快,要是直接进C:/Windows/Temp得卡死。要是服务器永远不重启不清理缓存,根据此种业务情况,Temp迟早有撑不住的一天。于是想办法清理C:/Windows/Temp,电脑管家清理了2个小时没有任何反应。估计它只是还没有遍历完,还没有到删除的那一步。
为了让系统快一点,先把IIS服务停止,退出电脑管家上“万能删除.bat”,3个多小时后处理OK了,业务恢复正常。