一个项目 大约有20个路由,每个路由都有constraints 约束,在台式机上测试 响应完全正常,内存消耗正常,但是在笔记本上 一次请求就能把 cpu 跑上80%,内存也是爆上爆下;
cpu都是i7 4核的,内存台式机是海盗船,笔记本是金士顿骇条,都是win7系统。排除了最初猜想的配置,加载的模块问题,最后发现是路由约束问题,删除了带0宽断言和其它复杂的路由,问题依旧;
再删除 controller = "ctname", action = "list" 所有这样的简单约束,只保留 page = @"\d{1,9}" 这样的约束 问题解决;
十分不解,why? .net 的路由靠正则匹配,每个controller action 匹配 20个路由 也就40个匹配而已,我非法词汇上千个正则匹配也不会这样;
不过当时非法词汇匹配过滤的时候 启用预编译 时台式机每次内存飙满 死机,笔记本不知道是不是有内存保护什么的 抛出内存溢出异常 自动关闭程序,关闭预编译就好了,网上说的是开启预编译要编译成程序集才行,我从数据库读取词库也办不到。
笔记本上运行时cpu问题我不知道怎么回事,内存爆涨暴跌; 难道是路由匹配正则使用了预编译,但我笔记本的.net 没把routeconfig编译成程序集,台式机的.net 把routeconfig编译成了程序集?
我猜测是你读数据库的时候可能有些请求你没有过滤条件,数据量太大,把内存撑爆了
你没仔细看内容吧。
@fishcats: 一个项目 大约有20个路由,每个路由都有constraints 约束,在台式机上测试 响应完全正常,内存消耗正常,但是在笔记本上 一次请求就能把 cpu 跑上80%,内存也是爆上爆下;
cpu都是i7 4核的,内存台式机是海盗船,笔记本是金士顿骇条,都是win7系统。排除了最初猜想的配置,加载的模块问题,最后发现是路由约束问题,删除了带0宽断言和其它复杂的路由,问题依旧;
再删除 controller = "ctname", action = "list" 所有这样的简单约束,只保留 page = @"\d{1,9}" 这样的约束 问题解决;
十分不解,why? .net 的路由靠正则匹配,每个controller action 匹配 20个路由 也就40个匹配而已,我非法词汇上千个正则匹配也不会这样;
不过当时非法词汇匹配过滤的时候 启用预编译 时台式机每次内存飙满 死机,笔记本不知道是不是有内存保护什么的 抛出内存溢出异常 自动关闭程序,关闭预编译就好了,网上说的是开启预编译要编译成程序集才行,我从数据库读取词库也办不到。
笔记本上运行时cpu问题我不知道怎么回事,内存爆涨暴跌; 难道是路由匹配正则使用了预编译,但我笔记本的.net 没把routeconfig编译成程序集,台式机的.net 把routeconfig编译成了程序集?
@刘宏玺:
要么是你没认真看全,要么是我表述有问题,那个是说我非法词汇从数据库读取数据 无法预编译成程序集,只能关闭正则的RegexOptions.Compiled 选项,否则就会造成内存爆发增长。
这么说是我猜想想 微软的类库正则匹配路由时是不是也启用了Compiled,但是我笔记本上的clr 又没把它预编译成程序集,所以导致了cpu花费巨大,内存爆增爆减。
我这是在问路由正则匹配导致的性能问题,和数据库没一点关系。
@fishcats: 要我说,20个路由是小意思,不会占用多少的,应该是其他的地方出问题了
@刘宏玺:
你没仔细看我的原问题。。。
又被微软坑了。。。现在微软的东西真是越来越糟糕。。。 翻看.net 源码 绝不难发现 str1、str2、goto、reflection 之类的东西。
问题又3个东西 共同构成:
1. net4.0 2.我的路由约束 3.我的htmlherlper 扩展方法;
第一种解决方法: 升级.net4 到 .net4.5 , 这也是我之前笔记本和台式机软环境唯一不同地方。
第二种解决方法: 删除我的路由约束,那些路由约束都不约束变量,其实都可以不写。
第三种解决方法: 不使用我的扩展方法,那肯定不行,而且测试 我调用30次扩展方法,完全不影响,调用33次就cpu,内存就行了,这算什么鬼??,难道和sql 分页使用not in 把数量和页面 变量写入sql语句每次定义并计算 ,数量就不能超过约30万一样 不可理解??
20个? 我的项目中至少有100个以上,没有出现你这样的问题,看看其他地方有没有问题。