设为首页 收藏本站
查看: 768|回复: 0

[经验分享] 设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死

[复制链接]

尚未签到

发表于 2015-11-3 11:01:19 | 显示全部楼层 |阅读模式
  声明:
  找到服务器僵死的原因了,原因是虚拟内存设置小于物理内存.
  只要虚拟内存设置为系统默认大小就不会出生僵死的现象了.
  当时因为服务器内存48G,系统默认虚拟内存大小也是48G,


  觉得太占硬盘空间,一时手贱,改小了虚拟内存,才会造成服务器长时间运行僵死的现象.



#include <tchar.h>
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, &quot;shlwapi.lib&quot;)
#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(&quot;SystemFileCacheLimit&quot;);
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(&quot;.ini&quot;));
if (dwArgc >=4)
{
::WritePrivateProfileString(TEXT(&quot;参数设置&quot;), TEXT(&quot;最大缓存&quot;), lpszArgv[3], szIni);
::WritePrivateProfileString(TEXT(&quot;参数设置&quot;), TEXT(&quot;最小缓存&quot;), lpszArgv[2], szIni);
MiniCache = _ttol(lpszArgv[2]) * 1024 * 1024;
MaxCache = _ttol(lpszArgv[3]) * 1024 * 1024;
}
else
{
if (PathFileExists(szIni))
{
MiniCache = ::GetPrivateProfileInt(TEXT(&quot;参数设置&quot;), TEXT(&quot;最小缓存&quot;), -1, szIni);
MaxCache = ::GetPrivateProfileInt(TEXT(&quot;参数设置&quot;), TEXT(&quot;最大缓存&quot;), -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(&quot;Progman&quot;), 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(&quot;使用方法:\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&quot;),
MiniCache/1024/1024, MaxCache/1024/1024,
dwFlags&FILE_CACHE_MIN_HARD_ENABLE ? TEXT(&quot;开启&quot;) : TEXT(&quot;关闭&quot;),
dwFlags&FILE_CACHE_MAX_HARD_ENABLE ? TEXT(&quot;开启&quot;) : TEXT(&quot;关闭&quot;));
::MessageBox(::GetDesktopWindow(), szMsg, TEXT(&quot;提示&quot;), MB_ICONASTERISK);
break;
case 2:
EnablePrivileges();
if (_tcsicmp(szArgList[1], TEXT(&quot;-flush&quot;)) == 0)
{
if (::SetSystemFileCacheSize(-1, -1, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE))
{
::MessageBox(GetDesktopWindow(), TEXT(&quot;刷新系统文件缓存成功!&quot;), TEXT(&quot;提示&quot;), MB_ICONASTERISK);
}else
{
::MessageBox(GetDesktopWindow(), TEXT(&quot;刷新系统文件缓存失败!&quot;), TEXT(&quot;提示&quot;), MB_ICONASTERISK);
}
}
else if(_tcsicmp(szArgList[1], TEXT(&quot;-disable&quot;)) == 0)
{
if (::SetSystemFileCacheSize(0, 0, FILE_CACHE_MAX_HARD_DISABLE|FILE_CACHE_MIN_HARD_DISABLE))
{
::MessageBox(GetDesktopWindow(), TEXT(&quot;已成功关闭系统文件缓存大小限制!&quot;), TEXT(&quot;提示&quot;), MB_ICONASTERISK);
}else
{
::MessageBox(GetDesktopWindow(), TEXT(&quot;关闭系统文件缓存大小限制失败!&quot;), TEXT(&quot;提示&quot;), 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(&quot;设置系统文件缓存大小上限成功!\n\n当前设置: 最小缓存%dMB, 最大缓存%dMB&quot;), MiniCache/1024/1024, MaxCache/1024/1024);
::MessageBox(GetDesktopWindow(), szMsg, TEXT(&quot;提示&quot;), MB_ICONASTERISK);
}
else
{
::MessageBox(GetDesktopWindow(), TEXT(&quot;设置系统文件缓存大小上限失败!&quot;), TEXT(&quot;提示&quot;), MB_ICONASTERISK);
}
break;
case 4:
if (_tcsicmp(szArgList[3], TEXT(&quot;-Service&quot;)) == 0)
{
TCHAR szPath[MAX_PATH] = {0};
SERVICE_DESCRIPTION SrvDesc;
SrvDesc.lpDescription = TEXT(&quot;Windows2008限制系统文件缓存工具\r\nBy zwfgdlc\r\n有任何疑问请联系:zwfgdlc@qq.com&quot;);
SC_HANDLE hScm = ::OpenSCManager(NULL, NULL, GENERIC_READ | GENERIC_WRITE);
::GetModuleFileName(NULL, szPath, _countof(szPath));
if (hScm)
{
SC_HANDLE hService = ::CreateService(hScm, lpSrvName, TEXT(&quot;SetSystemFileCache&quot;), 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(&quot;创建服务失败!\n服务已经存在,是否删除服务?&quot;), TEXT(&quot;警告&quot;), MB_ICONWARNING|MB_YESNO))
{
hService = ::OpenService(hScm, lpSrvName, DELETE);
if (hService!=NULL && ::DeleteService(hService))
{
::MessageBox(GetDesktopWindow(), TEXT(&quot;服务已删除!&quot;), TEXT(&quot;提示&quot;), MB_ICONASTERISK);
}
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hScm);
}
else
{
::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &SrvDesc);
if (IDYES == ::MessageBox(GetDesktopWindow(), TEXT(&quot;服务创建成功,是否立即启动服务?&quot;), TEXT(&quot;提示&quot;), MB_ICONASTERISK|MB_YESNO))
{
::StartService(hService, nArgs, (LPCTSTR*)szArgList);
}
::CloseServiceHandle(hService);
::CloseServiceHandle(hScm);
}
}
}
break;
default:
::MessageBox(GetDesktopWindow(), TEXT(&quot;参数不正确!&quot;), TEXT(&quot;提示&quot;), MB_ICONWARNING);
break;
}
LocalFree(szArgList);
return 1;
}
  



版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-134452-1-1.html 上篇帖子: windows server2008r2 下载 下篇帖子: Windows2008 64位系统asp连接access数据库解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表