小编Har*_*man的帖子

什么可以限制我的C#WCF服务上的CPU周期?

关于我们在那里运行的WCF服务,一两天前在我们的生产服务器上开始发生一些非常奇怪的事情:似乎有些事情开始将有问题的CPU周期限制为一个内核可用的CPU周期量,甚至虽然负载分布在所有核心上(该过程不会将一个核心烧至100%使用)

CPU图

该服务主要只是一个CRUD(创建,读取,更新,删除)服务,除了那里存在的一些长时间运行(最多可能需要20分钟)的服务调用.这些长时间运行的服务调用简单的线程并返回void,以便不使客户端应用程序等待,或者阻止WCF连接:

// WCF Service Side
[OperationBehavior]
public void StartLongRunningProcess()
{
    Thread workerThread = new Thread(DoWork);
    workerThread.Start();
}

private void DoWork()
{
    // Call SQL Stored proc
    // Write the 100k+ records to new excel spreadsheet
    // return (which kills off this thread)
}
Run Code Online (Sandbox Code Playgroud)

在上述呼叫启动之前,服务似乎应该响应,获取数据以快速显示在前端.

当您启动长时间运行的进程,并且CPU使用率达到100/CPUCores时,前端响应变得越来越慢,并且最终几分钟后不再接受任何WCF连接.

我认为正在发生的是,长时间运行的进程正在使用操作系统允许的所有CPU周期,因为有些东西限制了它,并且WCF无法接受传入连接,更不用说执行请求了.

在某些时候,我开始想知道我们的虚拟服务器运行的集群是否以某种方式执行此操作,但随后我们设法在我们的开发机器上重现这一点,客户端使用环回地址与服务进行通信,因此硬件防火墙不会干扰网络流量也是.

在VisualStudio内部测试时,我设法启动了这些长时间运行的进程中的4个并且调试器确认所有4个正在同时执行,在不同的线程中(通过检查Thread.CurrentThread.ManagedThreadId),但仍然只使用100/CPUCores值CPU周期总数.

在生产服务器上,它的CPU使用率不超过25%(4个内核),当我们将CPU内核加倍到8时,它的CPU使用率不会超过12.5%.

我们的开发机器有8个内核,CPU使用率也不会超过12.5%.

其他值得一提的服务

  • 它是一个Windows服务
  • 它在TopShelf主机内部运行
  • 在部署之后问题没有开始(无论如何我们的服务)
  • 生产服务器正在运行Windows Server 2008 R2 Datacenter
  • Dev Machines正在运行Windows 7 Enterprise

我们检查,仔细检查和尝试过的事情:

  • 将进程的优先级从正常更改为高
  • 检查处理器对进程的亲和力不限于特定核心
  • [ServiceBehavior]属性设置为ConcurrencyMode = ConcurrencyMode.Multiple
  • 传入的WCF服务调用正在不同的线程上执行
  • 仅在控制台应用程序中从托管WCF服务的等式中删除TopShelf
  • 设置WCF服务限制值:<serviceThrottling maxConcurrentCalls ="1000"maxConcurrentInstances ="1000"maxConcurrentSessions …

.net c# wcf multithreading topshelf

9
推荐指数
1
解决办法
492
查看次数

将带有和不带名称的名称空间添加到XElement

我需要生成如下所示的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <url>
        <loc>http://www.xyz.eu/</loc>
        <lastmod>2010-01-20T10:56:47Z</lastmod>
        <changefreq>daily</changefreq>
        <priority>1</priority>
    </url>
    <url>
        <loc>http://www.xyz.eu/2/</loc>
        <lastmod>2009-10-13T10:20:03Z</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>
    <url>
        <loc>http://www.xyz.eu/3/</loc>
        <lastmod>2009-10-13T10:19:09Z</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚如何在没有名称的情况下添加命名空间而不在所有url标记中添加'xmlns =""'.

我的代码:

XNamespace blank = XNamespace.Get(@"http://www.sitemaps.org/schemas/sitemap/0.9");
XNamespace xsi = XNamespace.Get(@"http://www.w3.org/2001/XMLSchema-instance");

XDocument doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement(blank + "urlset",
        //new XAttribute(XNamespace.Xmlns +"", blank),
        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
        // This private method loops through the dictionary and creates all the page nodes

        GetSiteMapChildren(pageIdVersionDic, site.Url)             
     ));
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢

c# xml linq linq-to-xml

5
推荐指数
1
解决办法
6078
查看次数

标签 统计

c# ×2

.net ×1

linq ×1

linq-to-xml ×1

multithreading ×1

topshelf ×1

wcf ×1

xml ×1