设置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防火墙 ...
随机推荐
- hadoop实现购物商城推荐系统
1,商城:是单商家,多买家的商城系统.数据库是mysql,语言java. 2,sqoop1.9.33:在mysql和hadoop中交换数据. 3,hadoop2.2.0:这里用于练习的是伪分布模式. ...
- Centos root权限的变化
方法一:更改 /etc/sudoers 文件, 找到以下一行,把前面的凝视(#)去掉 ## Allows people in group wheel to run all commands %whee ...
- URLDecoder和URLEncoder的使用总结
其实,这两个类的使用并不复杂,URLDecoder和URLEncoder它的作用主要是用于普通字符串和application/x-www-form-rulencoded MIME字符串之间的转换,一般 ...
- NET媒体文件操作组件TagLib
开源的.NET媒体文件操作组件TagLib#解析 人生得意须尽欢 莫使金樽空对月.写博客都会在吃饭后,每次吃饭都要喝上二两小酒,写博客前都要闲扯,这些都是个人爱好,改不掉了,看不惯的人,还望多多包 ...
- 将普通java工程转换成maven工程
在MyEclipse10中将Maven项目转成普通Java项目后,想将Java项目转成Maven项目,结果一下子傻眼了.根本就没有攻略中提到的config标签.仔细一看,喵咪的,人家用的是Eclips ...
- zabbix从听说到学会
一.zabbix简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供 ...
- JS简单验证password强度
<input type="password" id="password" value=""/><button id=&qu ...
- 在.net core 的webapi项目中将对象序列化成json
问题:vs2017 15.7.6创建一个基于.net core 2.1的webapi项目,默认生成的控制器继承自ControllerBase类 在此情况下无法使用Json()方法 将一个对象转成jso ...
- 微服务实践之路--RPC
微服务实践之路--RPC 重点来了,本文全面阐述一下我们的RPC是怎么实现并如何使用的,跟Kubernetes和Openstack怎么结合. 在选型一文中说到我们选定的RPC框架是Apache Thr ...
- 第1讲:The nature of Testing--測试的本质
*********声明:本系列课程为Cem Kanner的软件黑盒測试基础的笔记版************** What's A COMPUTER PROGRAM? Textbooks often d ...