天天看點

memcached 壓力測試以及性能分析

1、建立測試程式

     選用enyim用戶端

<configSections>
    <sectionGroup name="enyim.com">
      <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching"/>
    </sectionGroup>
  </configSections>
  <enyim.com>
    <memcached protocol="Binary">
      <servers>
        <add address="127.0.0.1" port="11211"/>
      </servers>
      <socketPool minPoolSize="10" maxPoolSize="200" connectionTimeout="00:00:05" deadTimeout="00:00:30"/>
    </memcached>
  </enyim.com>      

代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//using Tempus.Framework.Cache.MemCached;
using System.Data.Sql;
using System.Data.SqlClient;
using Enyim.Caching;
using Enyim.Caching.Memcached;
using Enyim.Caching.Configuration;
namespace TestMemcached
{
    public partial class memcached : System.Web.UI.Page
    {
        static MemcachedClient mc = new MemcachedClient();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!ConnectMemCached())
            {
                ConnectDB();
            }
        }

        private bool ConnectMemCached()
        {
            try
            {
                string result;
                object user;
                if (mc.TryGet("User", out user)) //測試緩存中是否存在key的值
                {
                    result = (string)user;
                    return true;
                }
                else
                {
                    return false;
                }

            }
            catch (Exception ex)
            {
                return false;
            }
        }

        private void ConnectDB()
        {
            string constr = "data source=localhost;initial catalog=Test;user id=sa;pwd=sa";
            SqlConnection conn = new SqlConnection(constr);

            conn.Open();

            string sql = "Select * From XDCM2007_Users Where UserId=18";

            SqlCommand cmd = new SqlCommand(sql, conn);

            SqlDataReader dr = cmd.ExecuteReader();
            Users user = new Users();

            while (dr.Read())
            {
                user.userName = dr["UserName"].ToString();
                user.RealName = dr["RealName"].ToString();
            }
            dr.Close();
            conn.Close();
            mc.ExecuteStore(StoreMode.Add, "User", user.userName, DateTime.Now.AddMonths(1));
        }

        public class Users
        {
            public int userId { get; set; }
            public string userName { get; set; }
            public string RealName { get; set; }

        }
    }
}      

2、Microsoft Web Application Stress Tool 壓力測試工具

安裝并啟動WAS,程式運作時會打開“Cteate new script”對話框,即建立一個新的腳本視窗(如圖1),如果運作WAS沒有打開該視窗可以單擊WAS主程式視窗工具欄上第一個按鈕“New Script”即可。

  為了使測試更加準确,更加接按真實效果,需要對錄制的測試腳本進行一些設定。

  去除靜态幹擾

  由于網頁是由圖檔、文字以及​​其它​​動态源碼組成的,而一般的靜态内容消耗的帶寬并不是很大,是以我們可以将其排除在外。在腳本中選中指向圖像、文字以及其它靜态檔案項目前的灰色按鈕,然後單擊工具欄上的“Delete”按鈕将其删除(圖4)

memcached 壓力測試以及性能分析

設定并發數

  然後在單擊“New Recorded Script”下的“Settings”标簽,其中“Concurrent Connections”是設定并發連接配接數的,其下面的“Stress level (threads)”和 “Stress multiplier(sockets perthread)” 分别設定對目标伺服器的壓力及負載程度的,其中Level是用戶端所産生的線程數目,一個線程可以産生多個Socket并發請求,是以将兩者的數值相乘,所獲得的數字就是用戶端同時連接配接的并發數(圖5)。

memcached 壓力測試以及性能分析

時間設定

  時間設定包括“Test Run Time”(測試運作時間)和“Request Delay”(停止響應)以及“Suspend”(挂起時間)三項。其中測試運作時間是以日、小時、分鐘和秒來設定的,建議該項時間不宜太短,如果設定的并發數較多,那麼時間應該按比較增長,以便産生足夠多的請求;而停止時間是指連接配接時超出這個時間即作逾時處理;在挂起時間處部分為Warmup和Cooldown兩項,一般可以設定為兩三分鐘為宜,這樣做的目的是避免測試開始和結束時資料的變形,影響測試的準确性。

  指定帶寬瓶頸

  “Bandwith”是指定帶寬瓶頸的,即選擇通路該網站大多數使用者所使用的帶寬。例如通路該網站的絕大部分使用者是撥号,那麼可以選擇56K。

  四、開始測試

  做好基本的設定工作後,就可以在左側選中建立的腳本“New Recorded Script”項,然後單擊工具欄上的“Run Script”按鈕,或者打開“Scripts”菜單下的“Run”指令,這樣就開始測試了。測試過程中會以進度條的方式實時顯示,待進度條結束我們即可進行測試結果分析了

現在我們就可以打開測試報告來檢視測試結果了。單擊“View”菜單,選擇“Reports”,在打開的視窗左側會按時間顯示所有測試報告。根據時間選擇本次測試報告,在視窗右側即可檢視具體内容。

  在測試報告中最重要的部分就是“Socket Errors”部分和“Result Codes”部分。其中Socket Errors部分共分為Connect、Send 、Recv和Timeouts。其中Connect表示用戶端不能與伺服器取得連接配接的次數;Send表示用戶端不能正确發送資料到伺服器的次數;Recv表示用戶端不能正确從伺服器接次的次數;Timeouts表示逾時的線程數目。由此我們可以如果這四個數值都比較小,甚至為0則說明我們的伺服器是經得起考驗的;如果數值居高不下,甚至接近設定的并發數,那麼則要好好的檢查你的伺服器了(圖6)。

memcached 壓力測試以及性能分析