声明:

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

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

当时因为服务器内存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. PHP中的加密方式有如下几种

    1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str  --  原始字符串. raw_output  --  ...

  2. 浏览器兼容性之ECMAScript

    1 IE中不能操作TR标签的innnerHTML. 2 日期处理函数不一致. (1)IE 8- new Date().getYear()返回的是到当前日期到1900年的差值,FF返回的是当前的年. ( ...

  3. Qt 的几个核心机制总结之 布局(QWidget可以设置setSizePolicy,而QSizePolicy有Fixed,minimum,maximum,preferred,expanding,ignore等7个属性,还可以横竖分开)

    1.Qt布局的作用 Qt的布局是通过布局管理器来实现的,布局管理器负责在父类窗口部件区域构建子窗口部件,使得放置在窗体中的每个窗口部件都有一个适合的大小和位置,并且能够随着应用程序本身的变化而变化从而 ...

  4. DDD实战4 实现产品仓储

    a.要实现仓储,首先要定义仓储接口.在领域层定义仓储接口,IProductRepository.cs. public interface IProductRepository { void Creat ...

  5. Python算法(含源代码下载)

    关键字:Python Algorithms Python算法  Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...

  6. [实时更新]jquery完整版下载

    jquery-2.1.0   注!不再支持IE 6/7/8 直接引用地址:  开发版地址1: <script src="http://code.jquery.com/jquery-2. ...

  7. 组态DNS、搜索域名和主机名

    一个.组态DNS和搜索领域 特别配置DNS该文件是/etc/resolv.conf:同时,我们可以ifcfg-eth0网卡的配置和其他配置文件中指定的. 演示样本: [root@instructor ...

  8. ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 标签助手 上一章节我们介绍了视图导入,学习了 ...

  9. WPF使用矢量字体图标(阿里巴巴iconfont)

    原文:WPF使用矢量字体图标(阿里巴巴iconfont) 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/78 ...

  10. scipy —— 丰富的子包(io、cluster)

    io,顾名思义,input/output,输入输出接口: 1. io Input and output (scipy.io) - SciPy v0.18.1 Reference Guide wavfi ...