我不知道为什么我的StreamInsight引擎无法处理超过140个事件/秒,条件是每秒传递8000个事件。我在性能监视器中看到了我的查询的事件数/秒数。并且在应用程序的控制台中就像引擎避免了很多事件。我有一个id为200的事件,然后是id为3330的下一个事件。有人知道问题是什么吗?
对于我的测试,我有一系列查询。第一个查询的输出是第二个查询的输入,依此类推,对于此方案,结果不超过140个事件/秒。
现在我用一个简单的查询测试了我的应用程序,该查询输出从输入流接收的所有事件,在这种情况下,服务器处理大约2000个事件/秒。我有一些结果的图像,但不幸的是我还不能把它们放进去。困扰我的是为什么事件数量突然减少到0以及为什么引擎仍然没有考虑所有输入事件。
以下是我的服务器配置和我正在使用的查询。
using (var server = Server.Create("SIInstance23"))
{
log.Info("StreamInsight Server started");
Application application = server.CreateApplication("StreamInsight Application Test");
ServiceHost host = new ServiceHost(server.CreateManagementService());
WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message);
binding.HostNameComparisonMode = HostNameComparisonMode.Exact;
host.AddServiceEndpoint(typeof(IManagementService),
binding,
"http://localhost:8081/StreamInsight/SIInstance23");
ScenarioWorkflow.NormalScenarioWorkflow(application, server, host);
}
public static void NormalScenarioWorkflow(this Application application, Server server, ServiceHost host)
{
host.Open();
IQStreamable<SensorDataEvent> inputStream = application.DefineSensorDataEventStream();
var simpleQuery = from e in inputStream
select e;
var simpleQueryConsumer = application.DefineConsumer(simpleQuery);
var simpleQueryBinding = simpleQuery.Bind(simpleQueryConsumer);
using (simpleQueryBinding.Run("process"))
{
Thread.Sleep(1000);
Console.WriteLine(string.Empty);
DiagnosticSettings settings = server.GetDiagnosticSettings(new Uri("cep:/Server/Application/StreamInsight Application Test/Entity/process/Query/StreamableBinding_1"));
settings.Aspects |= DiagnosticAspect.PerformanceCounters;
server.SetDiagnosticSettings(new Uri("cep:/Server/Application/StreamInsight Application Test/Entity/process/Query/StreamableBinding_1"), settings);
Console.WriteLine("***Hit Return to exit after viewing query output***");
Console.WriteLine();
Console.ReadLine();
}
host.Close();
}
接下来,当我尝试运行我的上一个查询(从链中)时,我得到了大约1500个事件/秒。事件/ s的突然减少仍然存在问题。我认为对事件进行的每次转换都会产生一个需要由引擎处理的新转换。所以,来自一系列查询的事件/ s的数量应该超过1500.如果我错了,请纠正我。我是这个领域的新手,欢迎任何建议。
我认为问题出在下面的课程中。
我也尝试使用PointEvent<SendorDataEvent>
代替SensorDataEvent
,并尝试插入CTI,但没有结果。
public class SocketEventInputAdapter : IObservable<SensorDataEvent>, IDisposable
{
public List<IObserver<SensorDataEvent>> observers { get; set; }
public object sync { get; set; }
public bool done { get; set; }
public SocketEventInputAdapter()
{
this.done = false;
this.observers = new List<IObserver<SensorDataEvent>>();
this.sync = new object();
SocketServer serverSocket = new SocketServer(4444, this);
}
internal void NotifyObservers(SensorDataEvent value)
{
lock (sync)
{
if (!done)
{
foreach (var observer in observers)
{
observer.OnNext(value);
}
}
}
}
public IDisposable Subscribe(IObserver<SensorDataEvent> observer)
{
lock (sync)
{
observers.Add(observer);
}
return new Subscription(this, observer);
}
void IDisposable.Dispose()
{
}
private sealed class Subscription : IDisposable
{
private readonly SocketEventInputAdapter _subject;
private IObserver<SensorDataEvent> _observer;
public Subscription(SocketEventInputAdapter subject, IObserver<SensorDataEvent> observer)
{
_subject = subject;
_observer = observer;
}
public void Dispose()
{
IObserver<SensorDataEvent> observer = _observer;
if (null != observer)
{
lock (_subject.sync)
{
_subject.observers.Remove(observer);
}
_observer = null;
}
}
}
}
谢谢。
答案 0 :(得分:0)
正如保罗所说,你需要提供更多的信息。可能会发生很多事情...... CTI未对齐/错误配置,源中不必要的锁定,锁定或长时间运行的任务......或其他任何事情。 在一台i7笔记本电脑上,我平均有超过120K事件/秒的StreamInsight流程......经过一周的压力测试。引擎会处理它。