声明:

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

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

当时因为服务器内存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. 已解决!Fatal error compiling: 无效的标记(maven启动失败)

    问题描述 Fatal error compiling: 无效的标记 maven启动错误..版本号不对 <plugin> <artifactId>maven-compiler-p ...

  2. JUnit中@Test的运行顺序

    原文链接: Test execution order 原文日期: 2012年12月06日 翻译日期: 2014年10月16日 翻译人员: 百里马 依照设计,Junit不指定test方法的运行顺序. 到 ...

  3. URLDecoder和URLEncoder的使用总结

    其实,这两个类的使用并不复杂,URLDecoder和URLEncoder它的作用主要是用于普通字符串和application/x-www-form-rulencoded MIME字符串之间的转换,一般 ...

  4. Video processing systems and methods

    BACKGROUND The present invention relates to video processing systems. Advances in imaging technology ...

  5. 概率图模型(PGM) —— 贝叶斯网络(Bayesian Network)

    概率图模型是图论与概率方法的结合产物.Probabilistic graphical models are a joint probability distribution defined over ...

  6. CSS(网页样式语言)基础

    所谓全栈,个体可以独立地完成系统的设计.开发.测试.部署以及运维.打通一个领域从无到有的全过程. 为什么会有 markdown 文本编辑显示工具呢,因为 html 太重了.markdown 是 htm ...

  7. CCD 与 CMOS

    窗帘快门与全局快门: 窗帘快门,每次只允许一条缝的光线摄入,因此会呈现自上而下的扫描式拍摄,也就意味着画面上的不同高度,其实拍摄的时间是不同的,也就进一步造成了在高速移动的火车上,如果拍摄窗外的景物, ...

  8. matlab 高级函数

    2*randn(sz):0 均值,方差为 4(variance), standard deviation:标准差为 2: numel():returns the # of elements: nume ...

  9. 【甘道夫】基于Mahout0.9+CDH5.2执行分布式ItemCF推荐算法

    环境: hadoop-2.5.0-cdh5.2.0 mahout-0.9-cdh5.2.0 引言 尽管Mahout已经宣布不再继续基于Mapreduce开发,迁移到Spark.可是实际面临的情况是公司 ...

  10. 罚函数(penalty function)的设计

    1. encourage sparsity ℓ0 范数: non-differentiable and difficult to optimize in general ℓ1 范数: 对数约束,log ...