zoukankan      html  css  js  c++  java
  • linux .net mono方案测试记录与报告(一)

    第一阶段 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方案,主要是三方面:

    1. 传统webserver+mono-fastcgi-server4 这里的webserver可以选择nginx apache
    2. 国产闭源第三方asp.net linux mono方案:jexus
    3. 微软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
    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
    结果之后没找到
    版本更新了的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
    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:UserssfisswDesktop迅雷下载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的方案;

    待续......

     

  • 相关阅读:
    深圳移动 神州行(大众卡/轻松卡/幸福卡)套餐资费(含香港日套餐)信息及使用方法
    PHP设置时区,记录日志文件的方法
    微信公众平台消息接口使用指南
    C#日期时间格式化
    使用CMD实现批量重命名[转]
    Python高效编程技巧
    实用WordPress后台MySQL操作命令
    ubuntu-wine
    Javascript 笔记与总结(2-8)对象2
    Swift5.3 语言指南(十) 枚举
  • 原文地址:https://www.cnblogs.com/sfissw/p/4603461.html
Copyright © 2011-2022 走看看