我需要一种限制服务程序可分配内存的方法,以防止服务程序耗尽系统资源,类似于SQL Server允许设置“最大服务器内存”的方式。
我知道SetProcessWorkingSetSize并不完全符合我的需求,但我正在尝试让它按照我认为应该的方式运行。无论我使用什么值,我的测试应用程序的工作集都没有受到限制。此外,如果我立即调用GetProcessWorkingSetSize,则返回的值与我之前指定的值不同。以下是我的测试应用程序使用的代码:
没有发生错误,但是 GetProcessWorkingSetSize 返回的最小值和最大值都是 81,920。我尝试在 Flags 参数中使用 QUOTA_LIMITS_HARDWS_MAX_ENABLE($00000004)使用 SetProcessWorkingSetSizeEx。不幸的是,如果在 Flags 中传递 $00000000 以外的任何内容,则 SetProcessWorkingSetSizeEx 失败并显示“代码 87。参数不正确。” 我还尝试使用作业对象来实现相同的目标。当启动子进程时,我使用作业对象设置了内存限制。但是,我需要让服务自己设置内存限制,而不是依赖于“启动”服务来完成。到目前为止,我还没有找到一种方法让单个进程创建作业对象,然后将自己添加到作业对象中。这总是失败并显示访问被拒绝。您有什么想法或建议吗?
我知道SetProcessWorkingSetSize并不完全符合我的需求,但我正在尝试让它按照我认为应该的方式运行。无论我使用什么值,我的测试应用程序的工作集都没有受到限制。此外,如果我立即调用GetProcessWorkingSetSize,则返回的值与我之前指定的值不同。以下是我的测试应用程序使用的代码:
var
MinWorkingSet: SIZE_T;
MaxWorkingSet: SIZE_T;
begin
if not SetProcessWorkingSetSize(GetCurrentProcess(), 20, 12800 ) then
RaiseLastOSError();
if GetProcessWorkingSetSize(GetCurrentProcess(), MinWorkingSet, MaxWorkingSet) then
ShowMessage(Format('%d'#13#10'%d', [MinWorkingSet, MaxWorkingSet]));
没有发生错误,但是 GetProcessWorkingSetSize 返回的最小值和最大值都是 81,920。我尝试在 Flags 参数中使用 QUOTA_LIMITS_HARDWS_MAX_ENABLE($00000004)使用 SetProcessWorkingSetSizeEx。不幸的是,如果在 Flags 中传递 $00000000 以外的任何内容,则 SetProcessWorkingSetSizeEx 失败并显示“代码 87。参数不正确。” 我还尝试使用作业对象来实现相同的目标。当启动子进程时,我使用作业对象设置了内存限制。但是,我需要让服务自己设置内存限制,而不是依赖于“启动”服务来完成。到目前为止,我还没有找到一种方法让单个进程创建作业对象,然后将自己添加到作业对象中。这总是失败并显示访问被拒绝。您有什么想法或建议吗?