Web Services Processor Utilization

J

John Doe

I have written a web service that returns an XmlDocument. The code is similar
to the example below, except it returns an XmlDocument rather than an
XmlDataDocument. When I run the service from the test harness in VS (or from
a client page), CPU utilization on the Web server spikes to over 50% and
returns quickly to around 0-5% after it has completed. I have tried the
following:
1) Changed the type returned by the web service to type string.
2) Turned off Session State on the web server
3) Turned off logging on the Web server
4) Use anonymous authentication.

I would like to limit the amount of processor used on the web server when
the service is called. My client is concerned about this, because eventually
there will be hundreds of concurrent users. What other steps can I take to
limit the amount of CPU used?

[WebMethod( Description="Returns Northwind Customers",EnableSession =false)]
public XmlDocument GetData()
{

SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist
Security Info=False;Initial Catalog=Northwind;Data Source=xxxxxxx");
SqlDataAdapter cmd = new SqlDataAdapter("Select * from Customers",conn);
DataSet ds = new DataSet();
cmd.Fill(ds,"Orders");
XmlDataDocument doc = new XmlDataDocument(ds);
return doc;
 
R

Randy A. Ynchausti

John Doe,
What other steps can I take to
limit the amount of CPU used?

[WebMethod( Description="Returns Northwind Customers",EnableSession
=false)]
public XmlDocument GetData()
{

SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist
Security Info=False;Initial Catalog=Northwind;Data Source=xxxxxxx");
SqlDataAdapter cmd = new SqlDataAdapter("Select * from Customers",conn);
DataSet ds = new DataSet();
cmd.Fill(ds,"Orders");
XmlDataDocument doc = new XmlDataDocument(ds);
return doc;

Have you tried database connection pooling? Otherwise, you may want to time
each statement in the web-service and determine what is causing the CPU
load -- where is all the processing time spent.

Regards,

Randy
 
D

dbottjer

In the example you give your query users a "select *" I realize this is
likely just an example but I would look at the query you are using and make
sure you are returning only the data you need. For example, specify each
collumn you need and do not use a select *. Furthermore, use a where clause
to eliminate unwanted data.

I would also suggest possibly applying indexes to the table or tables you
are returning data from. Indexes can help the database find the results you
are looking for faster.

As previously suggested caching might be a good option to look at.

Another suggestion would be to possibly look at using Data Transfermation
Objects (DTO) instead of a data set. Datasets can get rather large and do
have some overhead. Populating a collection of objects could possibly reduce
some overhead.
 
J

John Doe

The actual web service does not connect to a database, it connects to a
proprietary API gateway which also uses .Net. I apologize for the confusion,
but I was trying to illustrate the fact that, as in the example, when
returning an XML document with approximately 90 rows, that processor
utilization spikes to about 50%. The actual format of the XML Document is
similar to the following
<quotes><quote symbol="msft" close="26.8"></quote></quotes>


dbottjer said:
In the example you give your query users a "select *" I realize this is
likely just an example but I would look at the query you are using and make
sure you are returning only the data you need. For example, specify each
collumn you need and do not use a select *. Furthermore, use a where clause
to eliminate unwanted data.

I would also suggest possibly applying indexes to the table or tables you
are returning data from. Indexes can help the database find the results you
are looking for faster.

As previously suggested caching might be a good option to look at.

Another suggestion would be to possibly look at using Data Transfermation
Objects (DTO) instead of a data set. Datasets can get rather large and do
have some overhead. Populating a collection of objects could possibly reduce
some overhead.

John Doe said:
I have written a web service that returns an XmlDocument. The code is similar
to the example below, except it returns an XmlDocument rather than an
XmlDataDocument. When I run the service from the test harness in VS (or from
a client page), CPU utilization on the Web server spikes to over 50% and
returns quickly to around 0-5% after it has completed. I have tried the
following:
1) Changed the type returned by the web service to type string.
2) Turned off Session State on the web server
3) Turned off logging on the Web server
4) Use anonymous authentication.

I would like to limit the amount of processor used on the web server when
the service is called. My client is concerned about this, because eventually
there will be hundreds of concurrent users. What other steps can I take to
limit the amount of CPU used?

[WebMethod( Description="Returns Northwind Customers",EnableSession =false)]
public XmlDocument GetData()
{

SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist
Security Info=False;Initial Catalog=Northwind;Data Source=xxxxxxx");
SqlDataAdapter cmd = new SqlDataAdapter("Select * from Customers",conn);
DataSet ds = new DataSet();
cmd.Fill(ds,"Orders");
XmlDataDocument doc = new XmlDataDocument(ds);
return doc;
 
G

GCR

The problem is taht you still don't know if the spike is caused by the
service logic or by the logic you called through the API! Maybe you could
build and use a mock object instead of calling the API, to see if the high
processing load is in the service logic.

John Doe said:
The actual web service does not connect to a database, it connects to a
proprietary API gateway which also uses .Net. I apologize for the confusion,
but I was trying to illustrate the fact that, as in the example, when
returning an XML document with approximately 90 rows, that processor
utilization spikes to about 50%. The actual format of the XML Document is
similar to the following
<quotes><quote symbol="msft" close="26.8"></quote></quotes>


dbottjer said:
In the example you give your query users a "select *" I realize this is
likely just an example but I would look at the query you are using and make
sure you are returning only the data you need. For example, specify each
collumn you need and do not use a select *. Furthermore, use a where clause
to eliminate unwanted data.

I would also suggest possibly applying indexes to the table or tables you
are returning data from. Indexes can help the database find the results you
are looking for faster.

As previously suggested caching might be a good option to look at.

Another suggestion would be to possibly look at using Data Transfermation
Objects (DTO) instead of a data set. Datasets can get rather large and do
have some overhead. Populating a collection of objects could possibly reduce
some overhead.

John Doe said:
I have written a web service that returns an XmlDocument. The code is similar
to the example below, except it returns an XmlDocument rather than an
XmlDataDocument. When I run the service from the test harness in VS (or from
a client page), CPU utilization on the Web server spikes to over 50% and
returns quickly to around 0-5% after it has completed. I have tried the
following:
1) Changed the type returned by the web service to type string.
2) Turned off Session State on the web server
3) Turned off logging on the Web server
4) Use anonymous authentication.

I would like to limit the amount of processor used on the web server when
the service is called. My client is concerned about this, because eventually
there will be hundreds of concurrent users. What other steps can I take to
limit the amount of CPU used?

[WebMethod( Description="Returns Northwind Customers",EnableSession =false)]
public XmlDocument GetData()
{

SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist
Security Info=False;Initial Catalog=Northwind;Data Source=xxxxxxx");
SqlDataAdapter cmd = new SqlDataAdapter("Select * from Customers",conn);
DataSet ds = new DataSet();
cmd.Fill(ds,"Orders");
XmlDataDocument doc = new XmlDataDocument(ds);
return doc;
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,736
Latest member
AdolphBig6

Latest Threads

Top