声明:

找到服务器僵死的原因了,原因是虚拟内存设置小于物理内存.

只要虚拟内存设置为系统默认大小就不会出生僵死的现象了.

当时因为服务器内存48G,系统默认虚拟内存大小也是48G,

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

    1. #include <tchar.h>
    2. #include <stdio.h>
    3. #include <windows.h>
    4. #include <shlwapi.h>
    5. #pragma comment(lib, "shlwapi.lib")
    6. #ifndef FILE_CACHE_FLAGS_DEFINED
    7. #define FILE_CACHE_MAX_HARD_ENABLE      0x00000001
    8. #define FILE_CACHE_MAX_HARD_DISABLE     0x00000002
    9. #define FILE_CACHE_MIN_HARD_ENABLE      0x00000004
    10. #define FILE_CACHE_MIN_HARD_DISABLE     0x00000008
    11. #endif
    12. LPTSTR lpSrvName = TEXT("SystemFileCacheLimit");
    13. SERVICE_STATUS ServiceStatus = {0};
    14. SERVICE_STATUS_HANDLE hStatus;
    15. BOOL WINAPI EnablePrivileges()
    16. {
    17. HANDLE hToken;
    18. TOKEN_PRIVILEGES tkp;
    19. if (!::OpenProcessToken(::GetCurrentProcess(),
    20. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    21. return( FALSE );
    22. ::LookupPrivilegeValue(NULL, SE_INCREASE_QUOTA_NAME,
    23. &tkp.Privileges[0].Luid);
    24. tkp.PrivilegeCount = 1;
    25. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    26. ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
    27. (PTOKEN_PRIVILEGES)NULL, 0);
    28. if (::GetLastError() != ERROR_SUCCESS)
    29. return FALSE;
    30. return TRUE;
    31. }
    32. VOID WINAPI ServiceHandler(DWORD fdwControl)
    33. {
    34. switch(fdwControl)
    35. {
    36. case SERVICE_CONTROL_PAUSE:
    37. ServiceStatus.dwCurrentState = SERVICE_PAUSED;
    38. break;
    39. case SERVICE_CONTROL_CONTINUE:
    40. ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    41. break;
    42. case SERVICE_CONTROL_STOP:
    43. case SERVICE_CONTROL_SHUTDOWN:
    44. ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
    45. ServiceStatus.dwWin32ExitCode = 0;
    46. ServiceStatus.dwCheckPoint    = 0;
    47. ServiceStatus.dwWaitHint      = 0;
    48. SetServiceStatus(hStatus,&ServiceStatus);
    49. return ;
    50. case SERVICE_CONTROL_INTERROGATE:
    51. break;
    52. default:
    53. break;
    54. }
    55. SetServiceStatus(hStatus,&ServiceStatus);
    56. return ;
    57. }
    58. VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
    59. {
    60. DWORD   status = 0;
    61. DWORD   specificError = 0xfffffff;
    62. ServiceStatus.dwServiceType        = SERVICE_WIN32;
    63. ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
    64. ServiceStatus.dwControlsAccepted   =  SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;
    65. ServiceStatus.dwWin32ExitCode      = 0;
    66. ServiceStatus.dwServiceSpecificExitCode = 0;
    67. ServiceStatus.dwCheckPoint         = 0;
    68. ServiceStatus.dwWaitHint           = 0;
    69. hStatus = RegisterServiceCtrlHandler(lpSrvName,(LPHANDLER_FUNCTION)ServiceHandler);
    70. if (hStatus==0)
    71. {
    72. return;
    73. }
    74. status = GetLastError();
    75. if (status!=NO_ERROR)
    76. {
    77. ServiceStatus.dwCurrentState       = SERVICE_STOPPED;
    78. ServiceStatus.dwCheckPoint         = 0;
    79. ServiceStatus.dwWaitHint           = 0;
    80. ServiceStatus.dwWin32ExitCode      = status;
    81. ServiceStatus.dwServiceSpecificExitCode = specificError;
    82. SetServiceStatus(hStatus, &ServiceStatus);
    83. return;
    84. }
    85. ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
    86. ServiceStatus.dwCheckPoint         = 0;
    87. ServiceStatus.dwWaitHint           = 0;
    88. SetServiceStatus(hStatus, &ServiceStatus);
    89. ULONG MiniCache, MaxCache;
    90. TCHAR szIni[MAX_PATH] = {0};
    91. ::GetModuleFileName(NULL, szIni, _countof(szIni));
    92. ::PathRenameExtension(szIni, TEXT(".ini"));
    93. if (dwArgc >=4)
    94. {
    95. ::WritePrivateProfileString(TEXT("参数设置"), TEXT("最大缓存"), lpszArgv[3], szIni);
    96. ::WritePrivateProfileString(TEXT("参数设置"), TEXT("最小缓存"), lpszArgv[2], szIni);
    97. MiniCache = _ttol(lpszArgv[2]) * 1024 * 1024;
    98. MaxCache = _ttol(lpszArgv[3]) * 1024 * 1024;
    99. }
    100. else
    101. {
    102. if (PathFileExists(szIni))
    103. {
    104. MiniCache = ::GetPrivateProfileInt(TEXT("参数设置"), TEXT("最小缓存"), -1, szIni);
    105. MaxCache = ::GetPrivateProfileInt(TEXT("参数设置"), TEXT("最大缓存"), -1, szIni);
    106. MiniCache = MiniCache * 1024 * 1024;
    107. MaxCache = MaxCache * 1024 * 1024;
    108. }
    109. }
    110. EnablePrivileges();
    111. ::SetSystemFileCacheSize(MiniCache, MaxCache, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE);
    112. return;
    113. }
    114. int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nShowCmd)
    115. {
    116. SIZE_T MiniCache, MaxCache;
    117. DWORD dwFlags;
    118. TCHAR szMsg[512] = {0};
    119. LPWSTR* szArgList;
    120. int nArgs;
    121. if (!::FindWindow(TEXT("Progman"), NULL))
    122. {
    123. SERVICE_TABLE_ENTRY ServiceTable[2];
    124. ServiceTable[0].lpServiceName = lpSrvName;
    125. ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
    126. ServiceTable[1].lpServiceName = NULL;
    127. ServiceTable[1].lpServiceProc = NULL;
    128. StartServiceCtrlDispatcher(ServiceTable);
    129. return 1;
    130. }
    131. szArgList = ::CommandLineToArgvW(::GetCommandLineW(), &nArgs);
    132. switch(nArgs)
    133. {
    134. case 1:
    135. ::GetSystemFileCacheSize(&MiniCache, &MaxCache, &dwFlags);
    136. _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"),
    137. MiniCache/1024/1024, MaxCache/1024/1024,
    138. dwFlags&FILE_CACHE_MIN_HARD_ENABLE ? TEXT("开启") : TEXT("关闭"),
    139. dwFlags&FILE_CACHE_MAX_HARD_ENABLE ? TEXT("开启") : TEXT("关闭"));
    140. ::MessageBox(::GetDesktopWindow(), szMsg, TEXT("提示"), MB_ICONASTERISK);
    141. break;
    142. case 2:
    143. EnablePrivileges();
    144. if (_tcsicmp(szArgList[1], TEXT("-flush")) == 0)
    145. {
    146. if (::SetSystemFileCacheSize(-1, -1, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE))
    147. {
    148. ::MessageBox(GetDesktopWindow(), TEXT("刷新系统文件缓存成功!"), TEXT("提示"), MB_ICONASTERISK);
    149. }else
    150. {
    151. ::MessageBox(GetDesktopWindow(), TEXT("刷新系统文件缓存失败!"), TEXT("提示"), MB_ICONASTERISK);
    152. }
    153. }
    154. else if(_tcsicmp(szArgList[1], TEXT("-disable")) == 0)
    155. {
    156. if (::SetSystemFileCacheSize(0, 0, FILE_CACHE_MAX_HARD_DISABLE|FILE_CACHE_MIN_HARD_DISABLE))
    157. {
    158. ::MessageBox(GetDesktopWindow(), TEXT("已成功关闭系统文件缓存大小限制!"), TEXT("提示"), MB_ICONASTERISK);
    159. }else
    160. {
    161. ::MessageBox(GetDesktopWindow(), TEXT("关闭系统文件缓存大小限制失败!"), TEXT("提示"), MB_ICONASTERISK);
    162. }
    163. }
    164. break;
    165. case 3:
    166. MiniCache = _ttol(szArgList[1])*1024*1024;
    167. MaxCache = _ttol(szArgList[2])*1024*1024;
    168. EnablePrivileges();
    169. if (::SetSystemFileCacheSize(MiniCache, MaxCache, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE))
    170. {
    171. _stprintf_s(szMsg, _countof(szMsg), TEXT("设置系统文件缓存大小上限成功!\n\n当前设置: 最小缓存%dMB, 最大缓存%dMB"), MiniCache/1024/1024, MaxCache/1024/1024);
    172. ::MessageBox(GetDesktopWindow(), szMsg, TEXT("提示"), MB_ICONASTERISK);
    173. }
    174. else
    175. {
    176. ::MessageBox(GetDesktopWindow(), TEXT("设置系统文件缓存大小上限失败!"), TEXT("提示"), MB_ICONASTERISK);
    177. }
    178. break;
    179. case 4:
    180. if (_tcsicmp(szArgList[3], TEXT("-Service")) == 0)
    181. {
    182. TCHAR szPath[MAX_PATH] = {0};
    183. SERVICE_DESCRIPTION SrvDesc;
    184. SrvDesc.lpDescription = TEXT("Windows2008限制系统文件缓存工具\r\nBy zwfgdlc\r\n有任何疑问请联系:zwfgdlc@qq.com");
    185. SC_HANDLE hScm = ::OpenSCManager(NULL, NULL, GENERIC_READ | GENERIC_WRITE);
    186. ::GetModuleFileName(NULL, szPath, _countof(szPath));
    187. if (hScm)
    188. {
    189. 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);
    190. if (hService == NULL && ::GetLastError() == ERROR_SERVICE_EXISTS)
    191. {
    192. if (IDYES == ::MessageBox(GetDesktopWindow(), TEXT("创建服务失败!\n服务已经存在,是否删除服务?"), TEXT("警告"), MB_ICONWARNING|MB_YESNO))
    193. {
    194. hService = ::OpenService(hScm, lpSrvName, DELETE);
    195. if (hService!=NULL && ::DeleteService(hService))
    196. {
    197. ::MessageBox(GetDesktopWindow(), TEXT("服务已删除!"), TEXT("提示"), MB_ICONASTERISK);
    198. }
    199. ::CloseServiceHandle(hService);
    200. }
    201. ::CloseServiceHandle(hScm);
    202. }
    203. else
    204. {
    205. ::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &SrvDesc);
    206. if (IDYES == ::MessageBox(GetDesktopWindow(), TEXT("服务创建成功,是否立即启动服务?"), TEXT("提示"), MB_ICONASTERISK|MB_YESNO))
    207. {
    208. ::StartService(hService, nArgs, (LPCTSTR*)szArgList);
    209. }
    210. ::CloseServiceHandle(hService);
    211. ::CloseServiceHandle(hScm);
    212. }
    213. }
    214. }
    215. break;
    216. default:
    217. ::MessageBox(GetDesktopWindow(), TEXT("参数不正确!"), TEXT("提示"), MB_ICONWARNING);
    218. break;
    219. }
    220. LocalFree(szArgList);
    221. return 1;
    222. }

http://blog.csdn.net/zwfgdlc/article/details/6403006

设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)的更多相关文章

  1. windows2008系统缓存修改

    Windwos Server 2008 中经常有物理内存占用较高,但任务管理器中各进程的内存看起来占用并不多情况. 这可能是由于OS为保证服务器性能不限制系统缓存,服务器系统长时间执行I/O,系统文件 ...

  2. Windows2008系统忘记密码的解决方法

    网上转载的,忘记密码不用发愁了.   windows2008系统忘记密码的解决方法: 利用放大镜的漏洞来重设密码 首先用系统盘来引导 选择修复计算机 然后打开命令提示符:先备份放大镜,然后用CMD替换 ...

  3. 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 ...

  4. 分享:Windows2008重启后提示系统恢复选项的解决办法

    如题:WINdows2008服务器. 重启后提示系统恢复选项的解决办法 使用windows 2008后,不能启动的问题,重启后出现 修复系统选项 采用下面帖子中的部分命令搞定之. 我自己是直接使用:选 ...

  5. Ubuntu 备份系统为ISO镜像 & 解决ISO限制4GB大小 & Clone当前系统到其他电脑

    看标题,标题涵盖了3个部分,Ubuntu 备份系统为ISO镜像,  解决ISO限制4GB大小 ,  Clone当前系统到其他电脑  我们就从三个部分说起. Ubuntu 备份系统为ISO镜像 在Win ...

  6. mysql系列三、mysql开启缓存、设置缓存大小、缓存过期机制

    一.开启缓存 mysql 开启查询缓存可以有两种方法来开启一种是使用set命令来进行开启,另一种是直接修改my.ini文件来直接设置都是非常的简单的哦. 开启缓存,设置缓存大小,具体实施如下: 1.修 ...

  7. [Android] 字体使用dp单位避免设置系统字体大小对排版的影响

    [Android] 字体使用dp单位避免设置系统字体大小对排版的影响 以魄族mx3为例,在设置->显示->字体大小中能够选择字号大小例如以下图: 图1. 魄族mx3 会导致软件在有固定定高 ...

  8. mysql开启缓存、设置缓存大小、缓存过期机制

    目录 一.开启缓存 1.修改配置文件my.ini 2.命令方式 二.查看是否生效 1.query_cache_type 使用查询缓存的方式 2.have_query_cache 设置查询缓存是否可用 ...

  9. 高级设置电脑系统windows7防火墙出错代码0×6D9原因与解决技巧

    高级设置windows防火墙能够更好的保护电脑系统安全,在电脑系统windows7设置过程中难免会遇到某些问题,有用户在安装MRGT后想要打开SNMP的161端口,但在打开高级安全windows防火墙 ...

随机推荐

  1. js Map 遍历

    1. 在知道的key的情况下遍历map自然就跟数组一样的访. 2.在不知道key的情况下遍历map(此情况更多吧)    2.1  for(var key in Map){  };  //第一种   ...

  2. 【23.33%】【codeforces 664C】International Olympiad

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. WPF 拼音输入法

    原文:WPF 拼音输入法 本文来告诉大家如何使用 WPF 来写一个输入法,使用的方式是钩子. 目录 键盘 解析键盘 获得按键 输入流向 算法 实际上本文是在使用一个好用的软件 希沃白板 的时候发现在里 ...

  4. H∞一般控制问题的鲁棒叙述性说明

    Robust Control System:反馈控制有承受一定类不确定能力的影响,这一直保持在这种不确定的条件(制)稳定.动态特性(灵敏度)和稳态特性(逐步调整)的能力. 非结构不确定性(Unstru ...

  5. Scrollbox的滚动条事件scrollbar事件的处理(Lazarus)

    没办法,改源代码: 找到:Forms单元中scrollbox的父类: TScrollingWinControl = class(TCustomControl)    改: { TScrollingWi ...

  6. JavaScript动态广告弹出框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Android的DDMS中的Threads的各个字段的含义

    在使用DDMS调试代码时,Threads窗口中各个字段的含义从网上搜了下,如下所示: 该标签页显示了如下信息: ID – a VM-assigned unique thread ID. In Dalv ...

  8. PHP正则表达式入门教程[转]

      思维导图 点击下图,可以看具体内容!     介绍          正则表达式,大家在开发中应该是经常用到,现在很多开发语言都有正则表达式的应用,比如javascript,java,.net,p ...

  9. B&#233;zier curve

    Applications in computer graphics and computer-aided design (CAD) require the rapid generation of sm ...

  10. hdu3118Arbiter (使用二分图的定义,枚举每个状态)

    Arbiter Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Sub ...