我有一个.NET 2.0服务器似乎遇到了扩展问题,可能是由于套接字处理代码设计不佳,我正在寻找有关如何重新设计它以提高性能的指导.
使用场景: 50到150个客户端,每个客户端的高速率(高达100秒/秒)的小消息(每个10字节).客户端连接是长期的 - 通常是几个小时.(服务器是交易系统的一部分.客户端消息被聚合成组以通过较少数量的"出站"套接字连接发送到交换机,并且当交换机处理每个组时,确认消息被发送回客户端. .)OS是Windows Server 2003,硬件是2 x 4核X5355.
目前的客户端套接字设计:一个TcpListener
产生一个线程作为客户端连接到读取每个客户端套接字.线程阻塞Socket.Receive
,解析传入的消息并将它们插入到一组队列中以供核心服务器逻辑处理.使用Socket.BeginSend
来自与交换机侧通信的线程的异步调用,通过客户端套接字发回确认消息.
观察到的问题:随着客户端数量的增加(现在为60-70),我们开始在向客户端发送数据和从客户端接收数据时看到间歇性延迟高达100毫秒.(我们记录每条确认消息的时间戳,我们可以看到时间戳序列中偶尔会出现长时间间隔,这些间隙来自同一组中通常在几毫秒内完成的一串ack.)
整体系统CPU使用率很低(<10%),有足够的空闲RAM,核心逻辑和出站(面向交换)端表现良好,因此问题似乎与面向客户端的套接字代码隔离开来.服务器和客户端(千兆局域网)之间有足够的网络带宽,我们排除了网络或硬件层问题.
任何有用资源的建议或指示都将不胜感激.如果有人有任何诊断或调试技巧可以确定出错的地方,那么这些技巧也会很棒.
注意:我有MSDN杂志的文章Winsock:使用.NET中的高性能套接字更接近线路,我已经浏览了Kodart"XF.Server"组件 - 它看起来很粗略.
下面是我如何设置表示MandelBrot集合的数组的伪代码,但是当保留1:1的宽高比时,它会变得非常紧张.
xStep = (maxX - minX) / width;
yStep = (maxY - minY) / height;
for(i = 0; i < width; i++)
for(j = 0; j < height; j++)
{
constantReal = minReal + xStep * i;
constantImag = minImag + yStep * j;
image[i][j] = inSet(constantReal, constantImag);
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我曾尝试使用ASP.NET MVC一段时间,然后我遇到一个问题,我不想在母版页中包含我的所有js和css.但是如何从我的特定视图中将其注册到母版页的头部呢?
我有一个绑定到BindingList <T>的WPF ListView.绑定就像一个魅力,但我必须从单元格中跳出来获取绑定属性才能更新....这是一个问题,因为大多数用户在单击保存按钮之前不会跳出最后一列.
如何强制列表视图"保持"对绑定的DataContext的更改,而不做一些hackish.
我试图在我的页面类中使用它.我刚刚开始在PHP中使用对象,所以我仍然有点无能为力(但我尽可能多地学习).这是在我的page()
函数中(当有一个新的页面实例时调用)
set_error_handler('$this->appendError');
Run Code Online (Sandbox Code Playgroud)
这导致错误
警告:set_error_handler()期望参数(appendError)是有效的回调
现在如何在将函数作为字符串传递的同时设置类内部函数.这不可能吗?我应该使用普通函数,然后调用类函数并通过所有参数发送?这对我来说听起来有点麻烦.
或者我错过了这个问题?我已经尝试让我的appendError返回一个字符串,并回显..但它仍然不是很好玩.
任何帮助将不胜感激.
谢谢!!
我在我的项目中使用(GNU)Make.我目前正在为每个目录放置一个makefile,并使用SUBDIRS指定子目录.有人向我建议,这不是使用make的理想方式,即使用一个顶级make文件(或几个,使用include拆分).我过去曾尝试迁移/使用此布局,但在我看来,这是不必要的复杂.
使用递归makefile的优点/缺点是什么?
我正在使用Zend_Db在事务中插入一些数据.我的函数启动一个事务,然后调用另一个也尝试启动事务的方法,当然也失败了(我正在使用MySQL5).所以,问题是 - 我如何检测到该交易已经开始?以下是代码示例:
try {
Zend_Registry::get('database')->beginTransaction();
$totals = self::calculateTotals($Cart);
$PaymentInstrument = new PaymentInstrument;
$PaymentInstrument->create();
$PaymentInstrument->validate();
$PaymentInstrument->save();
Zend_Registry::get('database')->commit();
return true;
} catch(Zend_Exception $e) {
Bootstrap::$Log->err($e->getMessage());
Zend_Registry::get('database')->rollBack();
return false;
}
Run Code Online (Sandbox Code Playgroud)
在PaymentInstrument :: create中,还有另一个beginTransaction语句,它产生一个异常,说明该事务已经启动.
对不起,如果这是基本的,但我试图接受.Net 3.5.
问题:Func <>有什么好处,它有5个重载吗?从它的外观来看,我仍然可以自己创建一个类似的delgate,MyFunc <>具有5个重载甚至更多.
例如:public delegate TResult MyFunc<TResult>()
和各种超载的组合......
当我试图理解Func <>委托并且遇到以下情况时,想到了这个想法:
Func<int,int> myDelegate = (y) => IsComposite(10);
Run Code Online (Sandbox Code Playgroud)
这意味着一个委托有一个int类型的参数和一个int类型的返回类型.有五种变体(如果你通过intellisense查看重载).所以我猜我们可以有一个没有返回类型的委托?
所以我有理由说Func <>不是很好,只是我们可以使用的.Net框架中的一个例子,如果需要,创建自定义"func <>"代表以满足我们自己的需求?
谢谢,
为什么SQLite C/C++ API返回unsigned char *
文本值而不是更实际的char *
类型?
这与unsigned char问题有些相关,除了SQLite API的决定似乎与char *
字符串式值的传统建议相反.
例如:
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
Run Code Online (Sandbox Code Playgroud)