首页 新闻 会员 周边 捐助

asp.net mvc 路由约束会多大程度上消耗cpu?

0
悬赏园豆:10 [待解决问题]
一个项目 大约有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的主页 fishcats | 初学一级 | 园豆:198
提问于:2016-01-14 11:54
< >
分享
所有回答(3)
0

我猜测是你读数据库的时候可能有些请求你没有过滤条件,数据量太大,把内存撑爆了

刘宏玺 | 园豆:14020 (专家六级) | 2016-01-14 13:38

你没仔细看内容吧。

支持(0) 反对(0) fishcats | 园豆:198 (初学一级) | 2016-01-14 13:40

@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编译成了程序集?

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-01-14 13:41

@刘宏玺:

要么是你没认真看全,要么是我表述有问题,那个是说我非法词汇从数据库读取数据 无法预编译成程序集,只能关闭正则的RegexOptions.Compiled 选项,否则就会造成内存爆发增长。

这么说是我猜想想 微软的类库正则匹配路由时是不是也启用了Compiled,但是我笔记本上的clr 又没把它预编译成程序集,所以导致了cpu花费巨大,内存爆增爆减。

我这是在问路由正则匹配导致的性能问题,和数据库没一点关系。

支持(0) 反对(0) fishcats | 园豆:198 (初学一级) | 2016-01-14 13:52

@fishcats: 要我说,20个路由是小意思,不会占用多少的,应该是其他的地方出问题了

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-01-14 13:54

@刘宏玺: 

你没仔细看我的原问题。。。

支持(0) 反对(0) fishcats | 园豆:198 (初学一级) | 2016-01-14 13:56
0

又被微软坑了。。。现在微软的东西真是越来越糟糕。。。 翻看.net 源码 绝不难发现 str1、str2、goto、reflection 之类的东西。

问题又3个东西 共同构成:

1. net4.0      2.我的路由约束     3.我的htmlherlper 扩展方法;

第一种解决方法: 升级.net4 到 .net4.5 , 这也是我之前笔记本和台式机软环境唯一不同地方。

第二种解决方法: 删除我的路由约束,那些路由约束都不约束变量,其实都可以不写。

第三种解决方法: 不使用我的扩展方法,那肯定不行,而且测试 我调用30次扩展方法,完全不影响,调用33次就cpu,内存就行了,这算什么鬼??,难道和sql 分页使用not in 把数量和页面 变量写入sql语句每次定义并计算 ,数量就不能超过约30万一样 不可理解??

fishcats | 园豆:198 (初学一级) | 2016-01-15 16:01
0

20个? 我的项目中至少有100个以上,没有出现你这样的问题,看看其他地方有没有问题。

李伟-CodeL | 园豆:87 (初学一级) | 2016-03-24 22:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册