第一阶段 linux .net 方案测试 硬件为4核8线程的笔记本i7-4710mq 分配了4个线程 情况下
1、方案一 nginx+fastcgi-mono-server4方式
性能为每秒处理1400-1700个请求 这是4核4线程虚拟机情况下的,如果16核的性能应该至少可以达到4-5倍,
2、方案二 别选方案 jexus 国产闭源的linux .net web server
jexus在部署方面简单 兼容性可能也比较好, 实际测试性能似乎因为其有防ddos功能,所以测试下来没有被拒绝并发数下为350-700,估计实际服务器的性能与环境至少10倍以上于这个测试值
其他几个方案 由于代码要另外定制 所以延后测试
以下是第一阶段测试记录
很久以前,大概还在07年,我也做过asp.net在ubuntu下的尝试,当时大概是u版本6.04-7.04之间吧 ,好像是6.10,mono版本我记得比较清楚,大概1.2.6的样子,要源代码编译才能运行,现在因为mono已经不能同日而语了,很多大牛都推荐并且认为mono的linux下.net方案可以商业使用了,所以进行本次测试。
我所找到的linux mono asp.net方案,主要是三方面:
- 传统webserver+mono-fastcgi-server4 这里的webserver可以选择nginx apache
- 国产闭源第三方asp.net linux mono方案:jexus
- 微软owin方案,可选微软自己的owin实现 Katana 项目,同属jexus开发者的闭源owin实现--项目TinyFox
我比较熟悉ubuntu,我的系统因为是windows,所以用虚拟机来运行ubuntu当前版本15.04;物理机:我的笔记本、i7-4710mq 4核8线程、500gb ssd 三星evo850、内存16gb;使用vmware工作站11版虚拟机,虚拟机内配置:cpu4核、内存8gb、硬盘40gb,然后安装ubuntu15.04,更换国内软件源,更新不活。首先配置编译环境,ubuntu是deb软件包管理系统的,而mono的新版本通常不会很可被加入官方软件源,我喜欢在什么发行版就用什么发行版的包管理系统,所以新版本的软件源都要编译成deb包,最方便的deb制作方式我知道的是checkinstallsudo apt-get install checkinstall dh-make gcc g++
这样安装完成配置了基础的编译环境。
在我的使用中,ubuntu默认的输入法小企鹅fcitx 会看不到候选词,没找到设置上的问题,只好删了
sudo apt-get purge fcitx
还好中文输入方面系统自动用ibus补上了,虽然联想能力差了很多,但是至少勉强可以用了。
接下来,到mono官网www.mono-project.com/docs/getting-started/install/linux/#debian-ubuntu-and-derivatives找到ubuntu最新的mono安装方法,然后
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EFecho "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list sudo apt-get update 结果之后没找到版本更新了的MONO主包mono-runtime,找了网上的帖子,本来要去下源码编译的,发现某帖子上写着新的主要包是mono-complete,尝试之......一大堆要装,还好我网络快50m下载速度,检查mono版本, 然后安装MonoDevelop sudo apt-fast install monodevelop monodevelop-nunit monodevelop-versioncontrol sudo apt-fast install mono-xsp4 新建个项目然后新建一个webform页面,根据下文的代码输出.net版本信息 blog.csdn.net/penginpha/article/details/6947546
编译后 右击项目然后run with 用火狐看
项目 | 值 |
CPU 类型 | 未知 |
操作系统 | Linux |
IP 地址 | 127.0.0.1 |
.NET CLR 版本 | 0.0 |
浏览器 | *0 |
支持 ActiveX | 不支持 |
支持 Cookies | 不支持 |
支持 CSS | 不支持 |
语言 | zh-CN |
计算机/手机 | 计算机 |
Platform | unknown |
Win16 | 不是 |
Win32 | 不是 |
Http Accept Encoding | gzip, deflate |
User Agent | Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 |
不是为mono准备的代码所以未知不确定项多了呵呵,但是至少说明基础的调试环境已经完成了
现在去配置正式的几个环境,首先nginx+mono-fastcgi-server4:
sudo apt-fast install nginx mono-fastcgi-server4
然后去配置,按照mono官方www.mono-project.com/docs/web/fastcgi/nginx/有文档,
第三方开发者的尝试文档blog.chinaunix.net/uid-25508399-id-3234867.html,
先配置/etc/nginx/sites-available/default
server {
listen 801; server_name localhost; access_log /var/log/nginx/test.log; location /{ root /home/sfissw/www/; index index index.html index.htm default.aspx Default.aspx; fastcgi_index Home/Index; #指定根目录访问路径(default page) fastcgi_pass 127.0.0.1:9000; #mono fastcgi server的url (可以指定其他服务器,目前指向本地) include /etc/nginx/fastcgi_params; #包含 fastcgi params(php,aspnet相关的fastcgi参数配置) } }改成以上这样 root是mvc站点所在目录 fastcgi_index 就是主页链接 webform 用index.aspx 所以mvc就用Home/Index了 我没实验 不过linux的关系可能跟windows不一样 有大小写问题 有的时候可能要想到
再改 /etc/nginx/fastcgi_params
添加
fastcgi_param PATH_INFO "";fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
启动Nginx
启动fastcgi
然后如果是一个内容很少的aspx 所可以正常显示的 但是mvc可能就会一堆错 网上查过以后发现要重装xsp
这时候可能要先删掉一些mono的包 fast-mono-server4 mod-mono等 就不多提了
https://github.com/mono/xsp 去这里下载 xsp-matser.zip ......解压安装之 可能会需要另外安装基础包
sudo apt-fast install autoconf
在解压后的目录下
./autogen.sh
./configure --prefix=/usr
makesudo checkinstall
这里默认会有个版本号错误 只需要 在询问你用数字 来改变版本号等信息的时候 按 3 然后随意输入个数字即可
之后checkinstall会安装并且生成deb包在目录下了
用checkinstall的目的是为了方便集中管理 deb rpm包的好处即在于此
初步测试了一下,果然跟网友们说的那样,mvc要在mono下运行起来蛮困难,尝试了一个基本的基础项目mvc和webform各一个 mvc就没运行起来,所以不钻牛角尖了,
今天的测试内容很简单,就是进行单点高并发测试,redis是必须的,
去redis.io 官网下载当前2.x版本最新版redis-2.8.21.tar.gz,3.0版本有很大改动,我接受一些网友的建议所以暂时不考虑使用;
解压,后
sudo make
sudo make test 测试一下没错就可以生成deb包了
sudo checkinstall运行正常的话 redis应该已经安装好了
虚拟机一直没注意看自己的ip
sudo apt-fast install net-tools
然后
ifconfig
得到
eth0 Link encap:以太网 硬件地址 00:0c:29:b5:03:ba inet 地址:192.168.3.11 广播:192.168.3.255 掩码:255.255.255.0 inet6 地址: fe80::20c:29ff:feb5:3ba/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:502727 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:350025 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:251792406 (251.7 MB) 发送字节:114974666 (114.9 MB)lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 跃点数:1 接收数据包:3456387 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:3456387 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:1083574717 (1.0 GB) 发送字节:1083574717 (1.0 GB)本地ip就是192.168.3.11了执行redis
/usr/local/bin/redis-server现在去真机测试一下redis是否正常
cmd里执行
redis-benchmark -h 192.168.3.11 -q
PING (inline): 10559.66 requests per second
PING: 12804.10 requests per secondMSET (10 keys): 12195.12 requests per secondSET: 13736.26 requests per secondGET: 13192.61 requests per secondINCR: 13661.20 requests per secondLPUSH: 13458.95 requests per secondLPOP: 14792.90 requests per secondSADD: 13812.16 requests per secondSPOP: 14814.81 requests per secondLPUSH (again, in order to bench LRANGE): 13440.86 requests per secondLRANGE (first 100 elements): 13175.23 requests per secondLRANGE (first 300 elements): 6489.29 requests per secondLRANGE (first 450 elements): 5592.84 requests per secondLRANGE (first 600 elements): 4345.94 requests per second基本的get、set都在1.3w以上应该可以了 我的机器配置不低 但是同时开虚拟机还分配了一半的资源,加上真机浏览器和vs以及其他软件和服务,有这点性能也很难得了,
在windows 真机这边做一个基础的测试:
测试工具 apache ab
主要代码
Response.Clear();
string value = string.Empty; try { if (Request["value"] == null) { value = "false_" + Cache["time"].ToString(); } else { DateTime now = DateTime.Now; string k = System.Guid.NewGuid().ToString("N").ToLower(); string v = (now.ToString() + " " + now.Millisecond + Request["value"].ToString() + System.Guid.NewGuid().ToString("N")).ToLower(); System.Threading.ThreadPool.QueueUserWorkItem(state => { try { bool x = RedisConnection.Set<string>(k, v);//存储到redis redis是在虚拟机内的 //v = RedisConnection.StringGet(k); //Log.Enqueue(x.ToString() + "_" + DateTime.Now.ToString() + DateTime.Now.Millisecond.ToString() + "_" + k + "_" + v); //RedisConnection.KeyDelete(k); } catch (Exception oe) { string err = oe.Message + oe.StackTrace; } }, null); value = "true" + "______time:" + Cache["time"].ToString() + "______key:" + k + "______value" + v; } } catch { } Response.Write(value);首先作为参照 直接在vs2013模式下 1000并发模拟 速度约为700-800次请求每秒
250并发情况 在我的win7 iis 下是2622次请求每秒,
估计我的cpu核数有很大影响 只是4核8线程
第一个环境 nginx+fast-mono-server4
执行
sudo fastcgi-mono-server4 /applications=/:/home/sfissw/www /socket=tcp:127.0.0.1:9000
sudo /etc/init.d/nginx start启动这个组合测试结果 很不稳定 并发上去以后 就会崩溃 在没崩溃以前得到了几次测试结果 在我的机器配置下 大概是1000并发模拟情况下是 1400-1700次请求每秒的处理速度
C:\Users\sfissw\Desktop\迅雷下载\pc6-abdotexexz>ab -c 100 -n 1000 "http://192.1
8.3.11:801/index.aspx?value=True_2015/6/29%203:13:02286_976fb1e9e75a40d68b297b2e6d2dcef_2015/6/29%203:13:02%209217ba975a7f2ae4b45b47a13958ed66dd8True_2015/6/2%203:13:04301_b56625d5003e417c981355d232094"This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.3.11 (be patient)Completed 100 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsCompleted 1000 requestsFinished 1000 requestsServer Software: nginx/1.6.2Server Hostname: 192.168.3.11Server Port: 801Document Path: /index.aspx?value=True_2015/6/29%203:13:02286_976fb1e9e5a40d68b297b29e6d2dcef_2015/6/29%203:13:02%209217ba975a7f2ae4b45b47a13958ed66ddTrue_2015/6/29%203:13:04301_b56625d5003e417c981355d232094Document Length: 181 bytesConcurrency Level: 100Time taken for tests: 0.673 secondsComplete requests: 1000Failed requests: 0Write errors: 0Non-2xx responses: 1000Total transferred: 341000 bytesHTML transferred: 181000 bytesRequests per second: 1485.80 [#/sec] (mean)Time per request: 67.304 [ms] (mean)Time per request: 0.673 [ms] (mean, across all concurrent requests)Transfer rate: 494.78 [Kbytes/sec] receivedConnection Times (ms) min mean[+/-sd] median maxConnect: 0 1 0.7 0 4Processing: 15 63 21.6 58 114Waiting: 1 40 20.6 39 109Total: 15 64 21.8 58 114WARNING: The median and mean for the initial connection time are not within a nrmal deviation These results are probably not that reliable.Percentage of the requests served within a certain time (ms) 50% 58 66% 67 75% 78 80% 84 90% 99 95% 108 98% 110 99% 111 100% 114 (longest request)可能我分配给虚拟机的资源实在太多了,所以很多时候有cpu争夺的问题,下次测试应该试试两台物理机了,
第二个方案 jexus
下载解压 http://www.linuxdot.net/down/jexus-5.6.4.tar.gz
里面有个
sudo ./install
就安装好了
cd /usr/jexus打开/usr/jexus/siteconf #网站配置目录
遍及里面的roo条目 指向改成 /home/sfissw/www/
cd /usr/jexus/
sudo ./jws start
就能运行了 可能之前的方案代码已经适用mono了 加上这个方案本身定制化的很厉害 所以一下就运行起来了
很奇怪测试结果似乎jexus比之前的方案正常情况下数据还要小
大概在350-700的样子
可能是当时我的系统已经开了几天了,开的东西太多了下次得换两个物理机才行
本来想实验owin的闭源和开源的两个方案,结果因为owin环境支持的asp.net得特别打造,所以时间不够了,另外apache+mod-mono回头也可以试一下,虽然理论上讲apache的吞吐量应该低于nginx
下一回再进行双物理机情况下,以及owin的2个方案,apache的方案;
待续......