声明:

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

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

当时因为服务器内存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

最新文章

  1. MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)
  2. 2016年11月26号随笔(关于oracle数据库)
  3. 餐厅到店点餐系统(APP)
  4. C# 快速反射 IL
  5. mysql 批量插入
  6. JSP页面上用横线代替文本框
  7. android自定义控件之模仿优酷菜单
  8. JAVA LinkedList和ArrayList的使用及性能分析
  9. codevs4373 窗口
  10. Python网络编程——修改套接字发送和接收的缓冲区大小
  11. 13.怎样自学Struts2之Struts2本地化[视频]
  12. java集合练习
  13. c/c++ 栈与队列实现车库的出入与收费
  14. Vue2.5学习路线及基础知识总结。
  15. Java annotation浅析
  16. Oracle EBS数据定义移植工具:Xdf(XML Object Description File)
  17. #19 re&amp;jieba模块
  18. 【软工神话】第四篇(Alpha冲刺)
  19. mvc导出excel记录
  20. Kickstart无人值守安装[转载]

热门文章

  1. 检索05 --static静态方法 和 非静态方法
  2. sparksql parquet 合并元数据
  3. Yii2.0
  4. Crystal Report - 利用后台代码设计或实现水晶报表工具栏相关功能
  5. 嵌套函数中的this
  6. 主干(trunk)、分支(branch )、标记(tag)
  7. CMMI能力成熟度模型集成的过程域
  8. WPF 获取鼠标屏幕位置、窗口位置、控件位置
  9. Distinct去除重复项
  10. css 浏览器兼容性问题解决