设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)
声明:
找到服务器僵死的原因了,原因是虚拟内存设置小于物理内存.
只要虚拟内存设置为系统默认大小就不会出生僵死的现象了.
当时因为服务器内存48G,系统默认虚拟内存大小也是48G,
觉得太占硬盘空间,一时手贱,改小了虚拟内存,才会造成服务器长时间运行僵死的现象.
- #include <tchar.h>
- #include <stdio.h>
- #include <windows.h>
- #include <shlwapi.h>
- #pragma comment(lib, "shlwapi.lib")
- #ifndef FILE_CACHE_FLAGS_DEFINED
- #define FILE_CACHE_MAX_HARD_ENABLE 0x00000001
- #define FILE_CACHE_MAX_HARD_DISABLE 0x00000002
- #define FILE_CACHE_MIN_HARD_ENABLE 0x00000004
- #define FILE_CACHE_MIN_HARD_DISABLE 0x00000008
- #endif
- LPTSTR lpSrvName = TEXT("SystemFileCacheLimit");
- SERVICE_STATUS ServiceStatus = {0};
- SERVICE_STATUS_HANDLE hStatus;
- BOOL WINAPI EnablePrivileges()
- {
- HANDLE hToken;
- TOKEN_PRIVILEGES tkp;
- if (!::OpenProcessToken(::GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
- return( FALSE );
- ::LookupPrivilegeValue(NULL, SE_INCREASE_QUOTA_NAME,
- &tkp.Privileges[0].Luid);
- tkp.PrivilegeCount = 1;
- tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
- (PTOKEN_PRIVILEGES)NULL, 0);
- if (::GetLastError() != ERROR_SUCCESS)
- return FALSE;
- return TRUE;
- }
- VOID WINAPI ServiceHandler(DWORD fdwControl)
- {
- switch(fdwControl)
- {
- case SERVICE_CONTROL_PAUSE:
- ServiceStatus.dwCurrentState = SERVICE_PAUSED;
- break;
- case SERVICE_CONTROL_CONTINUE:
- ServiceStatus.dwCurrentState = SERVICE_RUNNING;
- break;
- case SERVICE_CONTROL_STOP:
- case SERVICE_CONTROL_SHUTDOWN:
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- SetServiceStatus(hStatus,&ServiceStatus);
- return ;
- case SERVICE_CONTROL_INTERROGATE:
- break;
- default:
- break;
- }
- SetServiceStatus(hStatus,&ServiceStatus);
- return ;
- }
- VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
- {
- DWORD status = 0;
- DWORD specificError = 0xfffffff;
- ServiceStatus.dwServiceType = SERVICE_WIN32;
- ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
- ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwServiceSpecificExitCode = 0;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- hStatus = RegisterServiceCtrlHandler(lpSrvName,(LPHANDLER_FUNCTION)ServiceHandler);
- if (hStatus==0)
- {
- return;
- }
- status = GetLastError();
- if (status!=NO_ERROR)
- {
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- ServiceStatus.dwWin32ExitCode = status;
- ServiceStatus.dwServiceSpecificExitCode = specificError;
- SetServiceStatus(hStatus, &ServiceStatus);
- return;
- }
- ServiceStatus.dwCurrentState = SERVICE_RUNNING;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- SetServiceStatus(hStatus, &ServiceStatus);
- ULONG MiniCache, MaxCache;
- TCHAR szIni[MAX_PATH] = {0};
- ::GetModuleFileName(NULL, szIni, _countof(szIni));
- ::PathRenameExtension(szIni, TEXT(".ini"));
- if (dwArgc >=4)
- {
- ::WritePrivateProfileString(TEXT("参数设置"), TEXT("最大缓存"), lpszArgv[3], szIni);
- ::WritePrivateProfileString(TEXT("参数设置"), TEXT("最小缓存"), lpszArgv[2], szIni);
- MiniCache = _ttol(lpszArgv[2]) * 1024 * 1024;
- MaxCache = _ttol(lpszArgv[3]) * 1024 * 1024;
- }
- else
- {
- if (PathFileExists(szIni))
- {
- MiniCache = ::GetPrivateProfileInt(TEXT("参数设置"), TEXT("最小缓存"), -1, szIni);
- MaxCache = ::GetPrivateProfileInt(TEXT("参数设置"), TEXT("最大缓存"), -1, szIni);
- MiniCache = MiniCache * 1024 * 1024;
- MaxCache = MaxCache * 1024 * 1024;
- }
- }
- EnablePrivileges();
- ::SetSystemFileCacheSize(MiniCache, MaxCache, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE);
- return;
- }
- int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nShowCmd)
- {
- SIZE_T MiniCache, MaxCache;
- DWORD dwFlags;
- TCHAR szMsg[512] = {0};
- LPWSTR* szArgList;
- int nArgs;
- if (!::FindWindow(TEXT("Progman"), NULL))
- {
- SERVICE_TABLE_ENTRY ServiceTable[2];
- ServiceTable[0].lpServiceName = lpSrvName;
- ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
- ServiceTable[1].lpServiceName = NULL;
- ServiceTable[1].lpServiceProc = NULL;
- StartServiceCtrlDispatcher(ServiceTable);
- return 1;
- }
- szArgList = ::CommandLineToArgvW(::GetCommandLineW(), &nArgs);
- switch(nArgs)
- {
- case 1:
- ::GetSystemFileCacheSize(&MiniCache, &MaxCache, &dwFlags);
- _stprintf_s(szMsg, _countof(szMsg), TEXT("使用方法:\n\nSetSystemFileCache.exe 最小缓存限制 最大缓存限制\n比如:SetSystemFileCache.exe 128 1024\n即设置最小缓存为128MB, 最大缓存1024MB\n\n刷新系统文件缓存: SetSystemFileCache.exe -flush\n\n关闭系统文件缓存限制(系统默认):\nSetSystemFileCache.exe -disable\n\n以服务方式运行:\nSetSystemFileCache.exe 128 1024 -Service\n即设置最小缓存为128MB,最大缓存为1024MB并以服务方式运行.\n\n当前系统文件缓存限制:\n最小文件缓存:%uMB\n最大文件缓存:%uMB\n最小文件缓存开关状态: %s\n最大文件缓存开关状态: %s\n"),
- MiniCache/1024/1024, MaxCache/1024/1024,
- dwFlags&FILE_CACHE_MIN_HARD_ENABLE ? TEXT("开启") : TEXT("关闭"),
- dwFlags&FILE_CACHE_MAX_HARD_ENABLE ? TEXT("开启") : TEXT("关闭"));
- ::MessageBox(::GetDesktopWindow(), szMsg, TEXT("提示"), MB_ICONASTERISK);
- break;
- case 2:
- EnablePrivileges();
- if (_tcsicmp(szArgList[1], TEXT("-flush")) == 0)
- {
- if (::SetSystemFileCacheSize(-1, -1, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE))
- {
- ::MessageBox(GetDesktopWindow(), TEXT("刷新系统文件缓存成功!"), TEXT("提示"), MB_ICONASTERISK);
- }else
- {
- ::MessageBox(GetDesktopWindow(), TEXT("刷新系统文件缓存失败!"), TEXT("提示"), MB_ICONASTERISK);
- }
- }
- else if(_tcsicmp(szArgList[1], TEXT("-disable")) == 0)
- {
- if (::SetSystemFileCacheSize(0, 0, FILE_CACHE_MAX_HARD_DISABLE|FILE_CACHE_MIN_HARD_DISABLE))
- {
- ::MessageBox(GetDesktopWindow(), TEXT("已成功关闭系统文件缓存大小限制!"), TEXT("提示"), MB_ICONASTERISK);
- }else
- {
- ::MessageBox(GetDesktopWindow(), TEXT("关闭系统文件缓存大小限制失败!"), TEXT("提示"), MB_ICONASTERISK);
- }
- }
- break;
- case 3:
- MiniCache = _ttol(szArgList[1])*1024*1024;
- MaxCache = _ttol(szArgList[2])*1024*1024;
- EnablePrivileges();
- if (::SetSystemFileCacheSize(MiniCache, MaxCache, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE))
- {
- _stprintf_s(szMsg, _countof(szMsg), TEXT("设置系统文件缓存大小上限成功!\n\n当前设置: 最小缓存%dMB, 最大缓存%dMB"), MiniCache/1024/1024, MaxCache/1024/1024);
- ::MessageBox(GetDesktopWindow(), szMsg, TEXT("提示"), MB_ICONASTERISK);
- }
- else
- {
- ::MessageBox(GetDesktopWindow(), TEXT("设置系统文件缓存大小上限失败!"), TEXT("提示"), MB_ICONASTERISK);
- }
- break;
- case 4:
- if (_tcsicmp(szArgList[3], TEXT("-Service")) == 0)
- {
- TCHAR szPath[MAX_PATH] = {0};
- SERVICE_DESCRIPTION SrvDesc;
- SrvDesc.lpDescription = TEXT("Windows2008限制系统文件缓存工具\r\nBy zwfgdlc\r\n有任何疑问请联系:zwfgdlc@qq.com");
- SC_HANDLE hScm = ::OpenSCManager(NULL, NULL, GENERIC_READ | GENERIC_WRITE);
- ::GetModuleFileName(NULL, szPath, _countof(szPath));
- if (hScm)
- {
- SC_HANDLE hService = ::CreateService(hScm, lpSrvName, TEXT("SetSystemFileCache"), SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, szPath, NULL, NULL, NULL, NULL, NULL);
- if (hService == NULL && ::GetLastError() == ERROR_SERVICE_EXISTS)
- {
- if (IDYES == ::MessageBox(GetDesktopWindow(), TEXT("创建服务失败!\n服务已经存在,是否删除服务?"), TEXT("警告"), MB_ICONWARNING|MB_YESNO))
- {
- hService = ::OpenService(hScm, lpSrvName, DELETE);
- if (hService!=NULL && ::DeleteService(hService))
- {
- ::MessageBox(GetDesktopWindow(), TEXT("服务已删除!"), TEXT("提示"), MB_ICONASTERISK);
- }
- ::CloseServiceHandle(hService);
- }
- ::CloseServiceHandle(hScm);
- }
- else
- {
- ::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &SrvDesc);
- if (IDYES == ::MessageBox(GetDesktopWindow(), TEXT("服务创建成功,是否立即启动服务?"), TEXT("提示"), MB_ICONASTERISK|MB_YESNO))
- {
- ::StartService(hService, nArgs, (LPCTSTR*)szArgList);
- }
- ::CloseServiceHandle(hService);
- ::CloseServiceHandle(hScm);
- }
- }
- }
- break;
- default:
- ::MessageBox(GetDesktopWindow(), TEXT("参数不正确!"), TEXT("提示"), MB_ICONWARNING);
- break;
- }
- LocalFree(szArgList);
- return 1;
- }
http://blog.csdn.net/zwfgdlc/article/details/6403006
设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)的更多相关文章
- windows2008系统缓存修改
Windwos Server 2008 中经常有物理内存占用较高,但任务管理器中各进程的内存看起来占用并不多情况. 这可能是由于OS为保证服务器性能不限制系统缓存,服务器系统长时间执行I/O,系统文件 ...
- Windows2008系统忘记密码的解决方法
网上转载的,忘记密码不用发愁了. windows2008系统忘记密码的解决方法: 利用放大镜的漏洞来重设密码 首先用系统盘来引导 选择修复计算机 然后打开命令提示符:先备份放大镜,然后用CMD替换 ...
- linux Kernell crash dump------kdump 的安装设置+Linux系统崩溃的修复解决过程+mysql+kvm
http://www.ibm.com/developerworks/cn/linux/l-cn-dumpanalyse/https://www.kernel.org/pub/linux/utils/k ...
- 分享:Windows2008重启后提示系统恢复选项的解决办法
如题:WINdows2008服务器. 重启后提示系统恢复选项的解决办法 使用windows 2008后,不能启动的问题,重启后出现 修复系统选项 采用下面帖子中的部分命令搞定之. 我自己是直接使用:选 ...
- Ubuntu 备份系统为ISO镜像 & 解决ISO限制4GB大小 & Clone当前系统到其他电脑
看标题,标题涵盖了3个部分,Ubuntu 备份系统为ISO镜像, 解决ISO限制4GB大小 , Clone当前系统到其他电脑 我们就从三个部分说起. Ubuntu 备份系统为ISO镜像 在Win ...
- mysql系列三、mysql开启缓存、设置缓存大小、缓存过期机制
一.开启缓存 mysql 开启查询缓存可以有两种方法来开启一种是使用set命令来进行开启,另一种是直接修改my.ini文件来直接设置都是非常的简单的哦. 开启缓存,设置缓存大小,具体实施如下: 1.修 ...
- [Android] 字体使用dp单位避免设置系统字体大小对排版的影响
[Android] 字体使用dp单位避免设置系统字体大小对排版的影响 以魄族mx3为例,在设置->显示->字体大小中能够选择字号大小例如以下图: 图1. 魄族mx3 会导致软件在有固定定高 ...
- mysql开启缓存、设置缓存大小、缓存过期机制
目录 一.开启缓存 1.修改配置文件my.ini 2.命令方式 二.查看是否生效 1.query_cache_type 使用查询缓存的方式 2.have_query_cache 设置查询缓存是否可用 ...
- 高级设置电脑系统windows7防火墙出错代码0×6D9原因与解决技巧
高级设置windows防火墙能够更好的保护电脑系统安全,在电脑系统windows7设置过程中难免会遇到某些问题,有用户在安装MRGT后想要打开SNMP的161端口,但在打开高级安全windows防火墙 ...
随机推荐
- 【9705】&&【a801】细胞
Time Limit: 10 second Memory Limit: 2 MB 问题描述 一矩形阵列由数字1~9代表细胞,细胞的定义是沿细胞数字上下左右如果还是细胞数字则为同一细胞,求给定矩形阵列的 ...
- View的绘制顺序
1.写在 super.onDraw() 的下面 把绘制代码写在 super.onDraw() 的下面,由于绘制代码会在原有内容绘制结束之后才执行,所以绘制内容就会盖住控件原来的内容. 2.写在 sup ...
- Cordova app 检查更新 ----JS进行调用(二)
原文:Cordova app 检查更新 ----JS进行调用(二) 1.获取版本号 需要添加 插件 cordova plugin add https://github.com/whiteoctober ...
- 【13.91%】【codeforces 593D】Happy Tree Party
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- myeclipse codelive插件关闭
开启这个插件时,当你运行web工程,打开页面会造成一些显示的问题,原因是codelive插件向你的页面代码中注入了一些js代码大概是如下这些 <script>"undefined ...
- Spring Quartz定时任务如何获得ServletContext对象?
servlet中可以得到ServletContext quartz调用servlet中的方法 完美解决了
- 辨异 —— 行星 vs 恒星
star:恒星,planet:行星: 1. 恒星 恒星是指宇宙中靠核聚变产生的能量而自身能发热发光的星体(比如太阳).过去天文学家以为恒星的位置是永恒不变的,以此为名.但事实上,恒星也会按照一定的轨迹 ...
- MATLAB Toolbox Path Cache is out of date and is not being used的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 使用mcc编译MATLAB\R2009a\extern\examples\compiler目录下的hello.m,编译 ...
- How to configure spring boot through annotations in order to have something similar to <jsp-config> in web.xml?
JSP file not rendering in Spring Boot web application You will need not one but two dependencies (ja ...
- XML DTD和XML Schema
CSDN原文.讲的很清楚.