第一阶段 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制作方式我知道的是checkinstall
sudo 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 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
版本更新了的MONO主包mono-runtime,找了网上的帖子,本来要去下源码编译的,发现某帖子上写着新的主要包是mono-complete,尝试之......一大堆要装,还好我网络快50m下载速度,检查mono版本,
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
结果之后没找到
然后安装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
make
sudo 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 second
MSET (10 keys): 12195.12 requests per second
SET: 13736.26 requests per second
GET: 13192.61 requests per second
INCR: 13661.20 requests per second
LPUSH: 13458.95 requests per second
LPOP: 14792.90 requests per second
SADD: 13812.16 requests per second
SPOP: 14814.81 requests per second
LPUSH (again, in order to bench LRANGE): 13440.86 requests per second
LRANGE (first 100 elements): 13175.23 requests per second
LRANGE (first 300 elements): 6489.29 requests per second
LRANGE (first 450 elements): 5592.84 requests per second
LRANGE (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_976fb1e9e75a40d68b297b2
e6d2dcef_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 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: nginx/1.6.2
Server Hostname: 192.168.3.11
Server Port: 801
Document Path: /index.aspx?value=True_2015/6/29%203:13:02286_976fb1e9e
5a40d68b297b29e6d2dcef_2015/6/29%203:13:02%209217ba975a7f2ae4b45b47a13958ed66dd
True_2015/6/29%203:13:04301_b56625d5003e417c981355d232094
Document Length: 181 bytes
Concurrency Level: 100
Time taken for tests: 0.673 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Total transferred: 341000 bytes
HTML transferred: 181000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 0.7 0 4
Processing: 15 63 21.6 58 114
Waiting: 1 40 20.6 39 109
Total: 15 64 21.8 58 114
WARNING: The median and mean for the initial connection time are not within a n
rmal 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的方案;
待续......