希望有人可以帮助我们,因为我们已达到调查的范围!
我们有一个用C#编写的简单异步套接字服务器,它接受来自ASP.NET Web应用程序的连接,发送消息,执行一些处理(通常是对数据库,但也是其他系统),然后将响应发送回客户端.客户负责关闭连接.
我们一直遇到这样的问题:如果系统长时间处于高负荷状态(通常是几天),CLOSE_WAIT套接字会在服务器框(netstat -a)上堆积到一定程度,以至于进程不接受任何进一步的连接.那时我们必须反弹这个过程然后再次运行.
我们已经尝试运行ASP.NET应用程序的一些负载测试来尝试复制问题(因为从代码中推断出某些问题是不可能的).我们认为我们已经对此进行了管理,并最终得到了一个问题的WireShark 数据包跟踪,该问题在套接字服务器的日志中表现为SocketException:
System.Net.Sockets.SocketException:System.Net.Sockets.Socket.BeginSend(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags,AsyncCallback回调,对象状态)中的远程主机强制关闭现有连接
我试图从数据包跟踪中重现问题,作为直接与套接字服务器通信的单线程进程(使用与ASP.NET应用程序相同的代码)并且无法进行.
有没有人对下一步的事情有任何建议,检查或明显我们可能做错了什么?
我是LINQ的新手,想知道如何执行多个where子句.这就是我想要实现的目的:通过过滤掉某些用户名来返回记录.我尝试了下面的代码但没有按预期工作.
DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
where ((r.Field<string>("UserName") != "XXXX") || (r.Field<string>("UserName") != "XXXX"))
select r;
DataTable newDT = query.CopyToDataTable();
Run Code Online (Sandbox Code Playgroud)
我在这里先向您的帮助表示感谢!!!
编辑for intro:
我们知道C#中的ref参数传递对变量的引用,允许在被调用的方法中更改外部变量本身.但是引用的处理方式与C指针非常相似(每次访问该参数时都会读取原始变量的当前内容,并且每次修改参数时都会更改原始变量),或者被调用的方法可以依赖于一致的引用.通话时间?前者提出了一些线程安全问题.特别是:
我在C#中编写了一个静态方法,它通过引用传递一个对象:
public static void Register(ref Definition newDefinition) { ... }
Run Code Online (Sandbox Code Playgroud)
调用者提供一个已完成但尚未注册的Definition对象,经过一些一致性检查后,我们"注册"他们提供的定义.但是,如果已经存在具有相同密钥的定义,则它不能注册新密钥,而是将其引用更新Definition为该密钥的"官方" .
我们希望这是严格的线程安全,但我想到了一个病态场景.假设客户端(使用我们的库)以非线程安全的方式共享引用,例如使用静态成员而不是局部变量:
private static Definition riskyReference = null;
Run Code Online (Sandbox Code Playgroud)
如果一个线程设置riskyReference = new Definition("key 1");,填写定义,并调用我们Definition.Register(ref riskyReference);而另一个线程也决定设置riskyReference = new Definition("key 2");,我们保证在我们的Register方法中newDefinition我们正在处理的引用不会被其他线程修改我们(因为引用了对象被复制并将在我们返回时复制出来?),或者其他线程可以在执行过程中替换我们上的对象(如果我们引用指向原始存储位置的指针???)打破我们的理智检查?
请注意,这与对基础对象本身的更改不同,这对于引用类型(类)当然是可能的,但可以通过该类中的适当锁定来轻松防范.但是,我们不能保护对外部客户端变量空间本身的更改!我们必须在方法的顶部创建我们自己的参数副本并覆盖底部的参数(例如),但这对于编译器来说似乎更有意义,因为处理的是精神错乱.不安全的参考.
因此,我倾向于认为引用可以被编译器复制并复制出来,以便该方法处理对原始对象的一致引用(直到它在需要时更改自己的引用),而不管是什么发生在其他线程上的原始位置.但是我们在文档和参考参数的讨论中找不到关于这一点的确定答案.
有人可以通过明确的引用来缓解我的担忧吗?
编辑得出结论:
用多线程代码示例确认了它(感谢Marc!)并进一步思考它,它确实是我自己所担心的非自动线程安全行为."ref"的一点是通过引用传递大结构而不是复制它们.另一个原因是你可能想要设置一个变量的长期监控,并且需要传递对它的引用,这将看到变量的变化(例如,在null和活动对象之间切换),这是一个自动复制 - in/copy-out不允许.
因此,为了使我们的Register方法能够抵御客户端的疯狂,我们可以像下面这样实现它:
public static void Register(ref Definition newDefinition) {
Definition theDefinition = newDefinition; // Copy in.
//... Sanity checks, actual work...
//...possibly …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种简单(无数据库)方法来列出网站上有多少用户活跃.我能想到的最简单的方法是计算开放会话的数量.
这段代码应该有效:
$number_of_users = count(scandir(ini_get("session.save_path")));
Run Code Online (Sandbox Code Playgroud)
当然它不会因为该目录的安全限制(因为应该有!!).有没有人知道另一种方法来访问此号码而不更改目录权限.
注意: 我正在寻找一个不涉及数据库或降低PHP会话安全性的选项.
结束注意:对于任何人来到这个问题,我最终使用了一个cronjob(每分钟运行一次)从root做了类似的事情:
ls /var/lib/php5/ | wc -l > /var/www/sessioncount
Run Code Online (Sandbox Code Playgroud)
确保/var/www/sessioncountapache用户可以读取该文件.然后你可以用PHP读取文件:
$number_of_users = file_get_contents("/var/www/sessioncount");
Run Code Online (Sandbox Code Playgroud) 我试图定义"行"列表时出现以下错误:
line-clip.cpp:44:错误:在'<'标记之前的预期初始化程序
#include <list>
using namespace std;
class Line {
public:
Point p1;
Point p2;
Line(Point P1, Point P2)
{
p1 = P1;
p2 = P2;
}
}
// Line List
list <Line> lineList;
Run Code Online (Sandbox Code Playgroud)
如何定义"Line"类型的通用列表?
我目前正在尝试优化我的网站,该网站运行在google的appengine上.这不是一件容易的事,因为我没有使用任何强大的工具.
有没有人有为此目的优化python代码的经验?你有没有找到一个好的python profiler?
标题听起来有点奇怪,但基本上我想知道如何设置我正在写的一些服务器软件的电子邮件发送?基本上我发送电子邮件的唯一时间是用户注册帐户或需要重置密码.高流量站点是否依赖于linux 邮件应用程序,还是有其他方法(如排队等)?
作为升级JRun的一部分,我们正在从1.4 JVM迁移到1.6 JVM.现在我得到一个非常奇怪的oracle db错误:"OALL8处于不一致状态".我已经确定了插入不使用绑定变量的查询的问题 - 所有内联参数.如果我在没有任何绑定变量的情况下运行查询,则会出现上述错误.只要我用绑定变量替换其中一个硬编码值 - 一切都可以正常工作.
另一个奇怪的是,在执行查询后,它实际上已提交给数据库.我可以从另一个会话连接并查看插入的行.我已经尝试在事务中包装查询,并且它似乎成功,因为没有显式事务,查询的行为没有改变.
以下是相关细节:
Java版本:1.6.0_12-b04
虚拟机版本:11.2-b01(HotSpot服务器)
Oracle服务器:10.2.0.4
Oracle客户端:11.1.0.7.0到ojdbc6.jar
更新:我使用的是cfqueryparam - 它们在oracle世界中被称为绑定变量.虽然这确实解决了当前的问题,但我们有一个相当大的遗留代码库,我们无法通过实际更新查询作为从CF7升级到CF8的一部分.
即使我已经确定了一个失败的特定情况(并将其封装在mxunit测试中) - 这并不意味着没有其他领域可能存在这个问题.我真的希望有一个解决方案来消除OALL8错误,而不是围绕它编码.
更新2:在使用我们的DBA检查后,他已将名为CURSOR_SHARING的参数设置为SIMILAR.Oracle默认为EXACT.发生的事情是当ColdFusion将查询关闭以执行时,Oracle正在将所有文字值转换为绑定变量,这似乎使ColdFusion感到困惑.将设置恢复为EXACT允许文字查询正常工作.
更新3: Oracle最终向我们发布了一个JDBC的带外补丁.它被识别为JDBC错误.最新的驱动程序应该在它们最终更新时包含它.如果您有支持,也可以通过他们的TAR系统请求补丁.
我开发了一些ASP.NET MVC应用程序,并喜欢这个框架.但是,有一点我不太明白为什么它仅限于网页用户界面.看起来分离视图和控制器的原因之一是允许多个视图重用相同的控制器逻辑.例如,我应该能够在与Web UI相同的控制器上挂起WPF UI.但我怀疑,我误解了关注点分离的根本性.ASP.NET MVC控制器是否仅限于在Web应用程序中使用?
更新:我不太感兴趣"是否有可能在桌面上做MVC" - 我知道Prism等允许这样做.然而,从设计的角度来看,我们希望分离关注点的一个"原因"是可重用性.如果我们不能重用控制器,感觉就像我们在重写WPF应用程序中的相同逻辑时重复自己.下面的答案确实为我澄清了一些.
我使用反射器来查看通用字典集合的代码(Dictionary <TKey,TValue>)并修改该代码以使其线程安全.我想在我的博客上发布这些代码,以便其他人可以查看它(并告诉我,如果我做错了),并且如果他们想要的话也可以在他们的项目中使用它.从法律上讲,我是否允许这样做?我大量修改了原始代码(并且只从原始代码中采用了一些方法而不是整个代码)但基本代码仍然相同,如果我这样做可能会有任何潜在的法律问题吗?
注意:以防有些人会指向线程安全字典的实现,我知道已经有使用ReaderWriterLockSlim的线程安全字典的实现,但我不想在阅读时(仅在写作时)锁定,除了我使用.net 2.0而不是3.5,所以无论如何我都不能使用ReaderWriterLockSlim,我也读到了2.0中ReaderWriterLock的性能非常差,所以我不想使用它.
c# ×3
.net ×2
asp.net-mvc ×1
c++ ×1
coldfusion ×1
crash ×1
email ×1
java ×1
jdbc ×1
jrun ×1
linq ×1
linq-to-sql ×1
list ×1
oracle ×1
parameters ×1
performance ×1
php ×1
python ×1
session ×1
sockets ×1
wireshark ×1
wpf ×1