我无法让"@header"或任何其他@规则在ANTLR中工作.使用非常基本的语法,如下所示:
grammar test;
options {
language = CSharp2;
}
@header {
using System.Collections.Generic;
}
tokens {
TEST;
}
something : TEST*;
TEST : '0' .. '9';
Run Code Online (Sandbox Code Playgroud)
这似乎遵循ANTLR文档和在线的各种其他示例,但是当我尝试通过ANTLRWorks v1.4或ANTLR jar v3.2生成输出时,我收到以下错误:
无法生成语法,因为:
error(100):[path]\test.g:11:1语法错误:antlr:[path]\test.g:11:1意外令牌:令牌{
哪个我好像无法动摇.我能够在没有语法中包含@header的情况下成功生成词法分析器和解析器.我在Windows上有最新版本的Java:
java版"1.6.0_22"Java(TM)SE运行时环境(版本1.6.0_22-b04)Java HotSpot(TM)客户端VM(版本17.1-b03,混合模式,共享)
我认为这很简单,我只是对它视而不见,所以请提出明显的答案.
我有一个麻烦的问题,我无法解释.简而言之,我的Web场中的Web服务器上的CPU使用率非常高.
我有大量用户访问两个前端Web服务器.99%的页面加载是Ajax请求,并提供简单的JSON序列化对象,Web服务器使用WCF从后端检索.在典型的情况下(同样可能是99%的请求),所有ASPX页面正在进行WCF调用以获取此数据,将其序列化为JSON字符串并返回它.
对象非常小 - 一个guid,一对短字符串,几个整数.
非典型情况是初始页面加载,它执行相同的操作(WCF请求),但使用asp:literals将响应注入页面的不同部分.
所有三台机器(2台Web服务器,一台后端)都具有相同的硬件规格.我希望后端在这种情况下完成大部分工作,因为它管理所有数据,进行查找等.但是:后端的负载远小于前端的负载.后端是一个不错的10-20%CPU负载.前端平均运行30%,但它们遍布地图,有时达到100%的峰值10秒,并且需要600ms才能为这些非常简单的页面提供服务.
当我在分析器(ANTS)中运行前端时,它将WCF通信标记为占用80%的CPU时间.这是对.NET生成的WCF代理的整个调用.
WCF设置:服务完全并行.我将实例化设置为"单一"并将并发设置为"多个".我打开服务上的maxConnections和listenBacklog到256.在严重的压力下(500个请求/秒),我看到前端服务器和服务之间有大约75个连接打开,所以它没有打到那个墙.我的安全设置为'none'.带宽使用约为电位的1/20(100Mb/s网络上为4Mb/s).
在客户端(Web服务器)上,我为该服务创建了一个静态ChannelFactory.调用服务的代码如下:
service = MyChannelFactory.CreateChannel();
try {
service.Call();
service.Close();
} catch {
service.Abort();
}
Run Code Online (Sandbox Code Playgroud)
(简化,但你得到的基本图片)
我不明白的是前端的所有负载来自何处.令人奇怪的是,它永远不会在30%-90%的范围内.它处于恐慌模式(100%)或正常(30%或更低).但是考虑到后端的负载,我预计这两台机器都会达到10%或更低.内存使用,手柄等都显得合情合理.
再添加一个皱纹:当我记录在后端服务这些呼叫所需的时间时,我得到的时间始终小于15毫秒(可能每分钟一到两个尖峰到30毫秒).在前端,这些调用最多可能需要1秒才能返回.我想这可能是因为CPU问题,但似乎对我而言.
那么......有没有人对这种东西的看法有什么想法?我正在探索要探索的事情.
说明:WCF服务托管在Windows服务中,并使用netTcp绑定.此外,我将客户端上的maxConnections设置为128,FWIW.