• 转:用Raspberry Pi搭建Azure(EventHub)

    Raspberry Pi是一款基于Linux的单板机电脑。它由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本计算机科学教育。树莓派配备一枚博通(Broadcom)出产的ARM架构700MHz BCM2835处理器,256MB內存(B型已升级到512MB内存),使用SD卡当作存储媒体,且拥有一个Ethernet、两个USB接口、以及HDMI(支持声音输出)和RCA端子输出支持。树莓派只有一张信用卡大小,体积大概是一个火柴盒大小,可以运行像《雷神之锤III竞技场》的游戏和进行1080p视频的播放。操作系统采用开源的Linux系统如Debian、ArchLinux,自带的Iceweasel、KOffice等软件,能够满足基本的网络浏览、文字处理以及电脑学习的需要。
    当然Raspberry Pi也可以成为最佳的IOT的终端设备,通过传感器收集数据,以供后台系统进行分析等。
    在Bash Shell中编写Python2.7的程序,获得温度传感器数据:
    #!/usr/bin/python
    from sense_hat import SenseHat
    sense = SenseHat()
    sense.clear()
    temp = sense.get_temperature()
    print(temp)
    运行此程序,可以在屏幕上打印目前的温度。
    同样,可以通过get_humidity()和get_pressure()等方法获得其他传感器的数值。
    具体的Sense-hat的各种python方法,请参考:
    https://pythonhosted.org/sense-hat/api/
     
    二.在Azure上创建Event Hub、Stream Analytics和SQL Azure DB
    1.创建Event hub:

    选择Custom create:

    填写相应的信息后输入:

    这样就创建了Event Hub的一个PaaS的服务。在配置中,创建一个Shared Access Policies:

    Save以后可以获得其SharedAccessKey:

    2.创建SQL Azure Database
    在Azure管理界面中选择SQL DB。在Server中选择Add:

    输入用户名和密码。创建SQL Server。

    然后选择创建SQL Database:

    创建好后,把本机的地址加入SQL的白名单:

    使用SQL的客户端连接数据库:

    在Options中选择数据库:

    登陆后创建table:
    Create table [dbo].[hwtest1] (
    Time Datetime2 (6) Null,
    DeviceId Varchar (16) Null,
    Temperature Float (53) Null,
    Humidity Float (53) Null
    );
    GO
    Create clustered index [hwtest1] on [dbo].[hwtest1] ([DeviceId] ASC);
    3.创建Stream Analytics

    创建成功后,在Input中添加Input:

    选择Event Hub:

    然后添加Event Hub的设置:

    在事件格式中选择JSON和UTF8

    创建Output:

    选择SQL Database,添加SQL的配置:

    在Query的设置中加入下面的配置:

    这里的DeviceId,Temperature,Humidity等参数必须在Python程序、Stream Analytics和SQL中相同。否则数据将不能取到。
    Input、Output和Query设置好后就可以启动此Job了。
    三.将Raspberry Pi的数据上传到Azure的Event Hub
    在Raspberry Pi上安装Azure的SDK:
    pip install azure
    安装完成后,更改Azure Service Bus的endpoint。请参考:
    https://msdn.microsoft.com/en-us/library/azure/dn578439.aspx
    对于Python的endpoint更改:
    在/usr/local/lib/python2.7/dist-packages/azure/servicebus/constants.py
    修改31行的配置
    #SERVICE_BUS_HOST_BASE = ‘.servicebus.windows.net’
    SERVICE_BUS_HOST_BASE = ‘.servicebus.chinacloudapi.cn’
     
    创建Python程序:
    #!/usr/bin/python
    from azure.servicebus import ServiceBusService
    from sense_hat import SenseHat
    from time import sleep
    import json;
    sense = SenseHat()
    sbs = ServiceBusService(“hwtest”, shared_access_key_name=”hwtest”, shared_access_key_value=”xxxxxx=”)
    while True:
    temp1 = sense.get_temperature()
    humi = sense.get_humidity()
    press = sense.get_pressure()
    temp= {‘DeviceId’: ‘dev-01’, ‘Temperature’: temp1, ‘Humidity’: humi}
    sbs.send_event(‘hwtest’, json.dumps(temp))
    sleep(60)
    调试程序让其后台运行。
    四.查看数据
    Raspberry Pi运行后,数据将发送到Azure的Event Hub。
    在Pi上可以通过tcpdump查看是否有https的包发送:
    tcpdump port 443
     
    在Stream Analytics上可以查看事件的情况:

    如果既有input又有output,说明配置正常。
    在Sql客户端上查询:
    Select * from hwtest1;

    五.通过Excel和PowerBI对数据进行分析
    目前Raspberry Pi的数据已经上传到了Event Hub,经过Stream Analytics发送到了SQL Server的表中。用户的展现可以通过Exel,PowerBI实现。
    1.Exel的展现:
    在Excel中选择数据,选择”自其他来源”,选择”来自SQL Server”。

    设置SQL Server:

    选择相应的数据库和相应的表:

    导入数据后,可以选择”插入”,选择”数据透视图”:

    在进行相应的选择后,将显示数据透视图:

    2.通过PowerBI实现展现
    打开网站: http://powerbi.microsoft.com
    下载Desktop的软件,进行安装。
    在客户端软件上进行SQL的连接配置:


    此时可以看到SQL中的表:

    选择import:

    选择相应的配置,就可以把数据以折线的形式展现出来:

    至此,所有的工作结束。

  • 转:Web网站压力测试工具

    Web网站性能体现在并发用户数已经网站的吞吐量和时延。
    最简单的压力测试工具就是ab “Apache Benchmark”
    下面将介绍ab的安装和使用:
    1. ab的安装
    ab的安装非常简单,安装了httpd,就自带ab
    CentOS下的安装:
    yum install -y httpd
    Ubuntu下的安装:
    apt-get install apache2
    安装好后,就可以使用ab了。
    2. ab使用前的准备工作
    由于ab是压力测试工具,我们需要把允许打开文件的数量调大。可以修改/etc/security/limits.conf

    echo "* soft nofile 65535" >> /etc/security/limits.conf;echo "* hard nofile 65535" >> /etc/security/limits.conf

    更改了这个配置后,需要重新启动VM。
    或者采用临时命令:

    ulimit -n 65535

    这样更改不需要重启机器。
    3. 运行ab,或wrk
    网上有很多ab和wrk使用的介绍,这里就不细讲了。一般打流量的命令是:

    ab -c 5000 -r -n 40000000 http://xx.xx.xx.xx/

    其中-c表示并发连接数;-n表示总共的请求数量;-r表示出现错误不退出,这个参数可以保证测试的连续性。注意http链接最后一定要是”/”,否则报错。

    wrk -t1 -c6000 -d2000s http://x.x.x.x/

     
    4. 脚本
    为了保证测试的连续性,下面的小脚本可以检测ab测试程序是否在运行。如果有,表示正在测试,等待10s,继续检测;如果没有,表示ab已经测试结束,需要重新启动。具体脚本如下:

    复制代码
    #!/bin/bash
    while true
    do
      flag=`ps -ef | grep "ab -c" | grep -v grep| wc -l`
      [ "$flag" = 1 ] && continue || ab -c 5000 -r -n 40000000 http://x.x.x.x/
      sleep 10
    done
    复制代码

    wrk的脚本如下

    复制代码
    #!/bin/bash
    while true
    do
    flag=`ps -ef | grep "wrk -t" | grep -v grep| wc -l`
    [ "$flag" = 1 ] && continue || /root/wrk-master/wrk -t1 -c6000 -d2000s http://x.x.x.x/
    sleep 10
    done
    复制代码

     
    把此脚本后台运行。
    5. 时延测试
    在服务器压力上去后,服务器的带宽和时延的检测成为检测服务器能力的指标之一。
    带宽的检测,可以采用nload、Zabbix等工具。
    时延的检测,也可以采用Zabbix等带外方式。本文采用的是比较简单的time工具。
    由于time和一般的Shell命令不同,grep、awk等语句不能正常的抓取执行结果。我们一般采用把执行结果输出到文件,再检索文件的方式。并且time的重定向是stderr的定向。具体命令是:

    (time -p curl http://x.x.x.x > /dev/null) &>> out.txt

    然后再采用grep real out.txt来获取时延。
    6. 时延脚本
    可以通过下面的脚本收集时延:

    复制代码
    #!/bin/bash
    while true
      do
      (time -p curl http://x.x.x.x > /dev/null) &> out.txt
      grep real out.txt | awk '{print $0 "\t" strftime()}' >> delay.txt
      sleep 10
    done
    复制代码

    7. 服务器端查看同时在线人数的命令
    netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,”t”,state[key]}’
    结果如下:
    TIME_WAIT t 32502
    FIN_WAIT1 t 4171
    FIN_WAIT2 t 267
    ESTABLISHED t 993
    SYN_RECV t 610
    CLOSING t 274
    LAST_ACK t 1
    或者用下面的命令:
    netstat -s | grep “connections established”
    4288 connections established
    8. 通过curl统计时延插入数据库

    复制代码
    #!/bin/bash
    while true
    do
      (time -p curl http://x.x.x.x > /dev/null) &> out.txt
      grep real out.txt | awk '{print $0 "\t" strftime()}' >> delay.txt
      time=$(TZ=Asia/Shanghai date "+%Y-%m-%d %H:%M:%S")
      webDelay=`grep real out.txt | awk '{print $2}'`
      hostn=`hostname`
      mysql -hxxxx -uxxxx -pxxxx -e "use delay; insert into delay2 (delay, time, host) values($webDelay,'$time','$hostn');"
    sleep 20
    done
    复制代码

    8.1 通过python脚本把时延插入数据库

    复制代码
    #!/usr/bin/env python
    import StringIO
    import pycurl
    import sys
    import os
    import time
    import MySQLdb
    import socket
    def getHTTPTime(url):
        crl = pycurl.Curl()
        #crl.setopt(pycurl.VERBOSE,1)
        crl.setopt(pycurl.FOLLOWLOCATION, 1)
        crl.setopt(pycurl.MAXREDIRS, 5)
        crl.fp = StringIO.StringIO()
        crl.setopt(pycurl.URL, url)
        crl.setopt(crl.WRITEFUNCTION, crl.fp.write)
        p = crl.perform()
        time = crl.getinfo(pycurl.TOTAL_TIME)
        return time
    url = "http://xx.xx.xx.xx/"
    myhost = socket.gethostname()
    host="xxx.mysqldb.chinacloudapi.cn"
    user="xxx"
    passwd="xxxxxx"
    db="delay"
    port=3306
    try:
      conn=MySQLdb.connect(host=host,user=user,passwd=passwd,port=port)
      conn.select_db(db)
      conn.select_db(db)
      cur=conn.cursor()
      while True:
        curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
        mytime = float(getHTTPTime(url))
        T = []
        T.append(mytime)
        T.append(curtime)
        T.append(myhost)
        cur.execute('insert into delay10  (delay, time, host) values(%s,%s,%s)',T);
        conn.commit()
        #aa=cur.execute('select id,delay,time from delay10')
        #print aa
        #for data in cur.fetchall():
        #  print data
        time.sleep(60)
    except MySQLdb.Error,e:
      print "Mysql Error %d: %s" % (e.args[0], e.args[1])
    复制代码

     
    9. 通过paping检测时延,并插入数据库

    复制代码
    #!/bin/bash
    while true
    do
      getDelay=`/root/paping -p 80 -c 1 x.x.x.x | grep time= | awk '{print $4}' | awk 'BEGIN{FS="="} {print $2}'`
      time=$(TZ=Asia/Shanghai date "+%Y-%m-%d %H:%M:%S")
      #webDelay=`echo ${a%ms*}`
      [ $getDelay ] && webDelay=$getDelay || webDelay=1000
      hostn=`hostname`
      mysql -hhwdelay.mysqldb.chinacloudapi.cn -uhwdelay%hengwei -pabc@123456 -e "use delay; insert into delay4 (delay, time, host) values('$webDelay','$time','$hostn');"
    sleep 20
    done
    复制代码

    10. php页面反应实际时延情况:

    复制代码
    <?php
        echo "xxx时延测试</br>";
        echo "大于1秒钟时延的统计";
        $mysql_server_name="xxxxxx"; //数据库服务器名称
        $mysql_username="xxxxx"; // 连接数据库用户名
        $mysql_password="xxxxx"; // 连接数据库密码
        $mysql_database="delay"; // 数据库的名字
        // 连接到数据库
        $conn=mysql_connect($mysql_server_name, $mysql_username,
                            $mysql_password);
         // 从表中提取信息的sql语句
        $strsql="select * from delay2 where delay > 1 order by id desc";
        // 执行sql查询
        $result=mysql_db_query($mysql_database, $strsql, $conn);
        // 获取查询结果
        $row=mysql_fetch_row($result);
        echo '<font face="verdana">';
        echo '<table border="1" cellpadding="1" cellspacing="2">';
        // 显示字段名称
        echo "</b><tr></b>";
        for ($i=0; $i<mysql_num_fields($result); $i++)
        {
          echo '<td bgcolor="#FF0000"><b>'.
          mysql_field_name($result, $i);
          echo "</b></td></b>";
        }
        echo "</tr></b>";
        // 定位到第一条记录
        mysql_data_seek($result, 0);
        // 循环取出记录
        while ($row=mysql_fetch_row($result))
        {
          echo "<tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++ )
          {
            echo '<td bgcolor="#00FF00">';
            echo $row[$i];
            echo '</td>';
          }
          echo "</tr></b>";
        }
        echo "</table></b>";
        echo "</font>";
        // 释放资源
        mysql_free_result($result);
        // 关闭连接
        mysql_close($conn);
    ?>
    复制代码

    11. 多监测点合并网页:

    复制代码
    <!DOCTYPE html>
    <html>
      <head>
        <title>HWTEST.html</title>
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"/>
        <meta http-equiv="description" content="this is my page"/>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
        <link rel="stylesheet" type="text/css" href="./test.css">
      </head>
      <body>
      <!-- Logo div -->
      <div class="logo">
       <h1>xxx时延测试比较页面</h1>
      </div>
      <!-- Adv div -->
      <div class="ad">
        <div class="stuad">
        <h4>Azure上海VM检测Azure北京VM时延</br></h4>
        <h4>大于1秒钟时延的统计</h4>
        <?php
          $mysql_server_name="xxx.chinacloudapi.cn"; //数据库服务器名称
          $mysql_username="xxx"; // 连接数据库用户名
          $mysql_password="xxx"; // 连接数据库密码
          $mysql_database="delay"; // 数据库的名字
          // 连接到数据库
          $conn=mysql_connect($mysql_server_name, $mysql_username,
                              $mysql_password);
           // 从表中提取信息的sql语句
          $strsql="select id,delay,time from delay2 where delay > 1 order by id desc";
          //$strsql="select * from delay2 where delay > 1 order by id desc";
          // 执行sql查询
          $result=mysql_db_query($mysql_database, $strsql, $conn);
          // 获取查询结果
          $row=mysql_fetch_row($result);
          echo '<font face="verdana">';
    //    echo '<table border="1" cellpadding="1" cellspacing="2">';
          echo '<table border="1" cellpadding="1" cellspacing="2" align="center">';
          // 显示字段名称
          echo "</b><tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++)
          {
            echo '<td bgcolor="#FF0000"><b>'.
            mysql_field_name($result, $i);
            echo "</b></td></b>";
          }
          echo "</tr></b>";
          // 定位到第一条记录
          mysql_data_seek($result, 0);
          // 循环取出记录
          while ($row=mysql_fetch_row($result))
          {
            echo "<tr></b>";
            for ($i=0; $i<mysql_num_fields($result); $i++ )
            {
              echo '<td bgcolor="#00FF00">';
              echo $row[$i];
              echo '</td>';
            }
            echo "</tr></b>";
          }
          echo "</table></b>";
          echo "</font>";
          // 释放资源
          mysql_free_result($result);
          // 关闭连接
          mysql_close($conn);
      ?>
        </div>
        <div class="ad2">
        <h4>家中采用curl检测页面时延</br></h4>
        <h4>大于1秒钟时延的统计</h4>
        <?php
          $mysql_server_name="xxx.chinacloudapi.cn"; //数据库服务器名称
          $mysql_username="xxx"; // 连接数据库用户名
          $mysql_password="xxx"; // 连接数据库密码
          $mysql_database="delay"; // 数据库的名字
          // 连接到数据库
          $conn=mysql_connect($mysql_server_name, $mysql_username,
                              $mysql_password);
           // 从表中提取信息的sql语句
          $strsql="select id,delay,time from delay3 where delay > 1 order by id desc";
          // 执行sql查询
          $result=mysql_db_query($mysql_database, $strsql, $conn);
          // 获取查询结果
          $row=mysql_fetch_row($result);
          echo '<font face="verdana">';
    //    echo '<table border="1" cellpadding="1" cellspacing="2">';
          echo '<table border="1" cellpadding="1" cellspacing="2" align="center" >';
          // 显示字段名称
          echo "</b><tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++)
          {
            echo '<td bgcolor="#FF0000"><b>'.
            mysql_field_name($result, $i);
            echo "</b></td></b>";
          }
          echo "</tr></b>";
          // 定位到第一条记录
          mysql_data_seek($result, 0);
          // 循环取出记录
          while ($row=mysql_fetch_row($result))
          {
            echo "<tr></b>";
            for ($i=0; $i<mysql_num_fields($result); $i++ )
            {
              echo '<td bgcolor="#00FF00">';
              echo $row[$i];
              echo '</td>';
            }
            echo "</tr></b>";
          }
          echo "</table></b>";
          echo "</font>";
          // 释放资源
          mysql_free_result($result);
          // 关闭连接
          mysql_close($conn);
      ?>
        </div>
        <div class="house">
        <h4>家中采用paping测试</br></h4>
        <h4>大于100ms时延的统计</h4>
        <?php
          $mysql_server_name="xxx.chinacloudapi.cn"; //数据库服务器名称
          $mysql_username="xxx"; // 连接数据库用户名
          $mysql_password="xxx"; // 连接数据库密码
          $mysql_database="delay"; // 数据库的名字
          // 连接到数据库
          $conn=mysql_connect($mysql_server_name, $mysql_username,
                              $mysql_password);
           // 从表中提取信息的sql语句
          $strsql="select id,delay,time from delay4 where delay > 100 order by id desc";
          // 执行sql查询
          $result=mysql_db_query($mysql_database, $strsql, $conn);
          // 获取查询结果
          $row=mysql_fetch_row($result);
          echo '<font face="verdana">';
    //    echo '<table border="1" cellpadding="1" cellspacing="2">';
          echo '<table border="1" cellpadding="1" cellspacing="2" align="center" >';
          // 显示字段名称
          echo "</b><tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++)
          {
            echo '<td bgcolor="#FF0000"><b>'.
            mysql_field_name($result, $i);
            echo "</b></td></b>";
          }
          echo "</tr></b>";
          // 定位到第一条记录
          mysql_data_seek($result, 0);
          // 循环取出记录
          while ($row=mysql_fetch_row($result))
          {
            echo "<tr></b>";
            for ($i=0; $i<mysql_num_fields($result); $i++ )
            {
              echo '<td bgcolor="#00FF00">';
              echo $row[$i];
              echo '</td>';
            }
            echo "</tr></b>";
          }
          echo "</table></b>";
          echo "</font>";
          // 释放资源
          mysql_free_result($result);
          // 关闭连接
          mysql_close($conn);
      ?>
        </div>
      </div>
      </body>
    </html>
    复制代码

    CSS文件:

    复制代码
    body{
    width:950px;
    margin: 0 auto;
    background-color: white;
    border: 1px solid red;
    font-size: 16px;
    }
    .logo{
    width: 950px;
    height: 68px;
    background-color: yellow;
    float: left;
    margin-top: 5px;
    text-align: center;
    }
    .ad{
    width: 950px;
    /*height: 212px;*/
    /*background-color: pink;*/
    margin-top: 5px;
    float: left;
    }
    .stuad{
    width: 310px;
    /*height: 196px;*/
    float: left;
    background-color: #ADFEDC;
    margin: 4px 0 0 4px;
    text-align: center;
    }
    .ad2{
    width: 310px;
    /*height: 196px;*/
    float: left;
    background-color: #D2A2CC;
    margin: 4px 0 0 4px;
    text-align: center;
    }
    .house{
    width: 310px;
    /*height: 196px;*/
    float: left;
    background-color: #FC7E8C;
    margin: 4px 0 0 4px;
    text-align: center;
    }
    复制代码

    12. 检测程序是否运行的脚本

    复制代码
    #!/bin/bash
    while true
    do
    cflag=`ps -ef | grep delay.sh | grep -v grep | wc -l`
    pflag=`ps -ef | grep mypachk.sh | grep -v grep | wc -l`
    echo $cflag  $pflag
    #[ "$flag" = 1 ] && continue || /root/delay.sh &
    [ "$cflag" = 0 ] && /root/delay.sh  || echo "curl is ok" >> record.txt
    [ "$pflag" = 0 ] && /root/mypachk.sh  || echo "paping is ok" >> record.txt
    sleep 600
    done
    复制代码