- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于 TCPListener
的 ECHO 服务器应用程序.它接受客户端,读取数据,并返回相同的数据。我使用 async/await 方法开发了它,使用 XXXAsync
框架提供的方法。
我已经设置了性能计数器来测量有多少消息和字节进出,以及有多少连接的套接字。
我创建了一个启动 1400 异步的测试应用程序 TCPClient
, 每 100-500ms 发送一个 1Kb 的消息。客户端在开始时会随机等待 10-1000 毫秒,因此他们不会尝试同时连接所有内容。我工作得很好,我可以在 PerfMonitor 中看到 1400 已连接,以良好的速率发送消息。我从另一台计算机运行客户端应用程序。服务器的 CPU 和内存使用量很少,它是带有 8Gb RAM 的 Intel Core i7。客户端似乎更忙,它是带有 4Gb RAM 的 i5,但仍然没有达到 25%。
问题是如果我启动另一个客户端应用程序。客户端的连接开始失败。我没有看到每秒消息的巨大增加(或多或少增加了 20%),但我看到连接的客户端数量仅在 1900-2100 左右,而不是预期的 2800。性能略有下降,图表显示每秒最大和最小消息之间的差异比以前更大。
尽管如此,CPU 使用率甚至还不到 40%,内存使用率仍然很少。我试图增加客户端和服务器中的线程数或池线程:
ThreadPool.SetMaxThreads(5000, 5000);
ThreadPool.SetMinThreads(2000, 2000);
while(true)
{
var client = await _server.AcceptTcpClientAsync();
HandleClientAsync(client);
}
HandleClientAsync
函数返回
Task
,但正如您看到的,循环不等待处理,只是继续接受另一个客户端。那个处理函数是这样的:
public async Task HandleClientAsync(TcpClient client)
{
while(ws.Connected && !_cancellation.IsCancellationRequested)
{
var msg = await ReadMessageAsync(client);
await WriteMessageAsync(client, msg);
}
}
TCPListener
表示
backlog
金额,但默认值是多少?
Task.Yield
和
Task.Run
方法,他们没有帮助。
"An existing connection was forcibly closed by the remote host" (System.Net.Sockets.SocketException) A System.Net.Sockets.SocketException was caught: "An existing connection was forcibly closed by the remote host"
"Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host." (System.IO.IOException) A System.IO.IOException was thrown: "Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host."
最佳答案
我已经成功地扩展到 6,000 个并发连接而没有问题,并且每秒处理大约 24,000 条消息,从没有机器的机器(没有本地主机测试)连接并且只使用大约 80 个物理线程。
我学到了一些教训:
增加线程池大小让事情变得更糟
除非你知道自己在做什么,否则不要做。
使用 Task.Yield 调用 Task.Run 或 yield
确保您释放调用线程参与方法的其余部分。
配置等待(假)
如果您确信自己不在单线程同步上下文中,那么从您的可执行应用程序中,这允许任何线程获取延续,而不是专门等待开始变得空闲的线程。
字节[]
内存分析器显示应用程序在创建 Byte[]
时花费了太多内存和时间。实例。所以我设计了几种策略来重用可用的策略,或者只是“就地”工作而不是创建新的并复制。 GC 性能计数器(特别是“% time in GC”,大约为 55%)发出警报,指出某些事情不正确。另外,我正在使用 BitArray
以字节为单位检查位的实例,这也导致了一些内存开销,所以我用按位操作替换它们并改进了。后来我发现 WCF 使用了 Byte[]
pool 来解决这个问题。
异步并不意味着 fast
异步允许很好地扩展,但它有成本。仅仅因为有一个可用的异步操作并不意味着您应该使用它。当您认为在获得实际响应之前需要等待一段时间时,请使用异步编程。如果您确定数据在那里或响应很快,请同步进行。
支持同步和异步很乏味
您必须两次实现这些方法,没有从同步代码中重新使用异步的防弹方法。
关于.net - 基于 TcpListener 的应用程序不能很好地扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22013072/
下类时合上笔记本电脑。当我回到家并打开它时,它已重新启动。现在,当我打开 Titanium Developer 时,它会立即崩溃。 所以我现在也打不开。关于如何调试或找出问题所在的任何想法? 甚至尝试
我们想共享运行时项目二进制文件。所以每个团队成员都可以使用当前的工作版本。 在 SVN 中存储运行时二进制文件是否可以接受/很好? 最佳答案 不,不要将二进制文件存储在其源代码旁边(除非您有充分的理由
我在 PHP 中使用循环来显示 CMS 管理部分中的用户数据。每行(用户)都包含一些我想要连接到命令的图标(例如:编辑、删除等)。表的最后一行有空的输入字段,带有单个图标(命令),以允许添加新用户。这
如果这是一个新手问题,请原谅我,我昨天开始学习 Django,并且我尽量不要养成坏习惯,即我试图从一开始就以“django 方式”做事。 我有一个 View 接收二进制数据作为 http post 字
使用 swift 2.1 我正在寻找一种将非可选类型数组分配给可选类型数组的好方法,其中类型相同。这是我尝试过的一些方法: var foos: [Int?] = [] let bars: [Int]
James Gosling,加拿大计算机科学家,完成了 Java 的原始设计,并实现了 Java 最初版本的编译器和虚拟机,也是公认的 “Java 之父”。 Evrone 是一家企业软件开发公司,
我在两个项目上使用 Twitter Bootstrap,一个是静态 HTML 网站,另一个是 Rails 应用程序。当我在桌面浏览器上测试网站时,调整大小有效。但是当我在手机 [Nokia E72]
我可以使用全日历。但我有一个侧边栏,用户可以折叠它,然后内容框会变大,但是当用户这样做时,日历就不那么好了。 所以我正在考虑窗口调整大小功能,但这仅在浏览器窗口更改时才有效,那么当容器变大或变小时如何
我正在尝试使用 C# 和 LINQ 在数据库中查询每日活跃用户。我有一个运行良好的 SQL 查询。它在 u.UserId).Distinct().Count() } 测试后,当我必须选择 (
我目前正在开发部署目标为 7.1 的 iOS 应用程序。我的大部分测试都是在 iOS8 环境中执行的,没有任何问题。我连接了一个 iOS7 (5s) 测试设备,发现通过手机显示的 View 是 3.5
我有这样的代码: Floating left. Floating right. BlahBlah Container 允许我将页脚推到页面底部,但如果我想让左右栏跨越接触页脚的高度
从 PHP4 和 Cake 1.3 开始,我一直在使用 debug($data);在 CakePHP 中调试诸如模型输出之类的东西。 但是,自从升级到 PHP5.4 后,我注意到 debug($dat
我在Canvas上画我的游戏,一切都是上帝,但我把它改成了JPanel,但现在它不能正常工作,这是代码,你可以复制它们,你就会看到问题出在哪里(我有一个菜单,单击按钮后它应该创建新线程,我想在那里画画
我尝试用 scrapy 抓取一页。我用 FireXpath(一个 firefox 插件)找到了 xpath,它看起来不错。但是对于 Scrapy,我没有得到任何结果。 我的 python 程序如下所示
我想在页面加载时加载 fancybox。它工作正常,但我对它的高度有疑问。假设页面的高度为 3000px,而 fancybox 的高度为 1500px。如果你想看到页面的最低部分,都应该向下滚动。不幸
IE 大小调整问题!?代码非常简单:我有一个 div,我想要一个占 DIV 100% 的文本框。它必须显示 div 的红线(如果我使用 height:100%, width:100% 它会侵 ecli
我有一组看起来像这样的代码: if(self.property == A) { [self.infoManager getThingA:^(NSString *thing, NSError *
我认为 git clone 使用 STDERR。 我现在想将它重定向到 STDOUT 以使用此 hack . 我遇到了一些问题(另外,我使用很棒的 stderred 库自动将 STDERR 着色为红色
我的问题是我的表单正在提交(到节点/express api),如果我console.log req.body(@ api),结果是一个空对象。但是,如果我在客户端上 console.log ,则序列化
我对 addon-sdk 还很陌生,并且遇到了一个对我来说无法解释的问题。到目前为止,我一直在使用 jpm run 来测试一切 - 并且一切都很好。现在,我即将完成我想要完成的任务,所以我想在“普通”
我是一名优秀的程序员,十分优秀!