Hi all,
I have a very simple DFS query asp.net test page (code below).
Page works fine when I hit it manually.
Then when I use apache ab to simulate a load, the IIS server (IIS 6.0 running on win2003 enterprise edition server) starts throwing System.OutOfMemoryException.
For example, just 30 concurrent users for 600 seconds:
C:\Program Files\Apache Software Foundation\Apache2.2>ab -kc 30 -t 600 "http://dmdevws1:8080/crmapplet/testpages/standardDFSLoadTest.aspx"
Server has 4 GB of RAM. During load testing, IIS reaches to about 1.2 GB - somewhere in between it starts failing - even though there is plenty of memory left on the server (like 2 GB free). Any ideas?
My web.config is as per the DFS gudie - also displayed at the bottom. Should i perhaps need to tweek this somehow? We use UCF for content transfer which works just fine, so we can reduce some of these message sizes if that would help? Not really sure what all the settings are for...
Anybody faced somethign similar? What tools/tracing options I should use for IIS?
The actual exception shown in the log is the useless DFS .net one:
So the log shows output of id/name for the cabinet fine for a while then it starts bombing out....
ERROR 2010-04-20 21:43:47,993 1173984ms - Exception.....:Service method "Execute" invocation failed..Stack trace: at Emc.Documentum.FS.Runtime.Context.Impl.ClientReflectionServiceInvoker.Invoke(Object proxy, MethodInfo method, Object[] args)
at Emc.Documentum.FS.Runtime.Context.Impl.SoapClientInvocationHandler.Invoke(Object proxy, MethodInfo method, Object[] arguments)
at Emc.Documentum.FS.Runtime.Context.Impl.UcfClientInvocationHandler.Invoke(Object proxy, MethodInfo method, Object[] args)
at Emc.Documentum.FS.Runtime.Context.Impl.HttpSessionInvocationHandler.Invoke(Object proxy, MethodInfo method, Object[] args)
at Emc.Documentum.FS.Runtime.Context.Impl.ContextThreadLocalInvocationHandler.Invoke(Object proxy, MethodInfo method, Object[] args)
at Emc.Documentum.FS.Runtime.Context.Impl.ReturnedContentTransformationHandler.Invoke(Object proxy, MethodInfo method, Object[] args)
at Emc.Documentum.FS.Runtime.Context.Impl.ServiceContextInvocationHandler.Invoke(Object proxy, MethodInfo method, Object[] args)
at $Proxy1.Emc.Documentum.FS.Services.Core.IQueryService.Execute(Query , QueryExecution , OperationOptions )
at crm.testpages.standardDFSLoadTest.Page_Load(Object sender, EventArgs e) in
(all over the place - exceptions are same like that).
C:\workspace\dotnet\crm\crm\testpages\standardDFSLoadTest.aspx.cs:line 53
DFS server log is showing no exceptions at all...the heartbeat keeps running fine...:
.....
2010-04-20 22:10:55,362 DEBUG [com.arjuna.ats.arjuna.logging.arjLogger] AtomicActionRecoveryModule: Second pass
2010-04-20 22:10:55,362 DEBUG [com.arjuna.ats.txoj.logging.txojLoggerI18N] [com.arjuna.ats.internal.txoj.recovery.TORecoveryModule_6] - TORecoveryModule - second pass
2010-04-20 22:10:55,362 DEBUG [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.recovery.info.secondpass] Local XARecoveryModule - second pass
....
When i actually hit the server manually to see the page, thats when I get the standard IIS server out of memory exception....
Page source code - very basic stuff:
protected void Page_Load(object sender, EventArgs e)
{
Log.Debug("starting out of the box page load test...");
if (!IsPostBack)
{
try
{
IServiceContext context = ContextFactory.Instance.NewContext();
context.AddIdentity(new RepositoryIdentity("dev_doc_01", "dmadmin", "document10",
""));
IQueryService querySvc = ServiceFactory.Instance.GetRemoteService<IQueryService>(context, "core",
AttachmentUtil.
DfsServerUri);
//define the query
PassthroughQuery query = new PassthroughQuery();
query.QueryString = "select r_object_id, object_name from dm_cabinet";
query.AddRepository(AttachmentUtil.DefaultRepository);
QueryExecution queryEx = new QueryExecution();
queryEx.CacheStrategyType = CacheStrategyType.DEFAULT_CACHE_STRATEGY;
//no special options are needed
OperationOptions operationOptions = null;
//execute
QueryResult queryResult = querySvc.Execute(query, queryEx,
operationOptions);
//parse the results and create a list of attachmentinfo objects
//which will be displayed in the ui (renedered in the gridview)
DataPackage resultDp = queryResult.DataPackage;
List<DataObject> dataObjects = resultDp.DataObjects;
foreach (DataObject dObj in dataObjects)
{
PropertySet docProperties = dObj.Properties;
String objectId = dObj.Identity.GetValueAsString();
String name = docProperties.Get("object_name")
.GetValueAsString();
Log.Debug("id=" + objectId + ", name: " + name);
}
}
catch (Exception ex)
{
Log.Error("Exception.....:" + ex.Message + ".Stack trace: " + ex.StackTrace);
throw;
}
}
}
}
Here is the web config relevant section:
<ConfigObject type="Emc.Documentum.FS.Runtime.Impl.Configuration.ConfigObject, Emc.Documentum.FS.Runtime" defaultModuleName="core" registryProviderModuleName="core" requireSignedUcfJars="true">
<ModuleInfo name="core" protocol="http" host="dctm65sp2" port="8888" contextRoot="services"/>
<ModuleInfo name="search" protocol="http" host="dctm65sp2" port="8888" contextRoot="services"/>
<ModuleInfo name="bpm" protocol="http" host="dctm65sp2" port="8888" contextRoot="services"/>
<ModuleInfo name="collaboration" protocol="http" host="dctm65sp2" port="8888" contextRoot="services"/>
</ConfigObject>
</FS>
</Emc.Documentum>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="DfsAgentService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="1000000" maxBufferPoolSize="10000000" maxReceivedMessageSize="1000000" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
<binding name="DfsContextRegistryService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="1000000" maxBufferPoolSize="10000000" maxReceivedMessageSize="1000000" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
<binding name="DfsDefaultService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="1000000" maxBufferPoolSize="10000000" maxReceivedMessageSize="1000000" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
<system.web>
<!--
Set compilation debug="true" to insert debugging
symbols into the compiled page. Because this
affects performance, set this value to true only
during development.
-->
<compilation debug="true">
</compilation>
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Windows"/>
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.
<customErrors mode="on" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<httpRuntime maxRequestLength="15360" executionTimeout="360"/>
</system.web>
<system.codedom>
</system.codedom>
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->
<system.webServer>
</system.webServer>
</configuration>
Thanks for helping,
Mirza