函數:web_reg_find、web_image_check和web_find
web_reg_find(文本檢查點)函數的使用方法和技巧
web_reg_find(
“Search=查找的範圍”,
“Save Count=記錄緩衝出現的次數”,
“Test=查找的參數”,
LAST);
If (atoi(lr_eval_string(“{N_count}”)) > 0 )
用法:在緩衝中查找,所以要放在查找內容之前
web_image_check(圖片檢查點)函數的使用方法和技巧
web_image_check(
“函數標題”,
“ALTSRC=圖片的全路徑”,
LAST);
用法:在HTML中使用,要放在查找內容之前,必須勾選run-time→Perferences→Enable Image and Test Check
3.2、關聯
函數:web_reg_save_param、web_reg_save_param_ex
web_reg_save_param(_ex)函數的使用方法和技巧
web_reg_save_param(_ex)(
“關聯函數名”,
“LB=左邊界”,
“RB=右邊界”,
“Ord(Ordinal)= 出現的次數”,
“Search = 查找的範圍”,
“SaveOffset = 偏移的量”,
“SaveLen = 保存的長度”,
“LAST”);
技巧:在關聯參數中隨機選值;
方法一:定義變量,使用LR_paramarr_random函數取值,如下:
Char *param;
Param=lr_paramarr_random(“關聯函數名”);
Lr_save_string(“Param”,“新參數名”);
方法二:定義隨機參數,在Ord(Ordinal)中利用參數隨機參數取值,如下:
在參數列表中定義參數random_num
將Ord(Ordinal)={random_num}
3.3、參數
Parameter List界面介紹
File format中Column選項如下:
Comma:以逗號分隔
Tab:以Tab分隔
Space:以空格分隔
Select next row中選項如下:
Sequential:順序取值
Random:隨即取值
Unique:唯一取值
Update value on中選項如下:
Each iteration:每次迭代更新
Each occurrence:每次取值更新
Once:只更新一次
When out of values中選項如下:
Abort Vuser:參數超出後退出
Continue in a cyclic value:參數超出後循環
Continue with last value:參數超出後使用最後一個值
技巧1:如果所需參數中存在空格(逗號),需要在File format中選擇以Comma(Tab)分隔,否則參數不可用。或者在參數中的將逗號用“”
技巧2:在Date/Time中可以設置自增自減。在offset標籤中勾選Offset parameter
自增:勾選Working days onl
自減:勾選prior to current
技巧3:如果參數過多時,可以將多個參數放到一個參數表中。如下圖:
3.4、思考時間
lr_think_time(3);
技巧:如果模擬用戶的操作可適當添加思考時間。
如果想獲取TPS的值,則不能加思考時間和集合點。
3.5、小技巧
3.5.1、 LR中浮點數相加
double atof( const char *string);//申明
float UpPrice1;
float UpPrice2;
float i=0.1;
char * UpPrice3=(char*)calloc(100,sizeof(char));
lr_save_string( lr_eval_string("{CorrelationParameter_2}"),
"UpPrice1" );
//lr_error_message("打印結果%s", lr_eval_string("{UpPrice1}"));
UpPrice2=atof(lr_eval_string ("{UpPrice1}"))+i;
atof( lr_eval_string("{UpPrice1}") );
sprintf( UpPrice3,"%.2f",UpPrice2 );
lr_save_string( UpPrice3,"UpPrice" );
lr_error_message("打印結果:%s", lr_eval_string("{UpPrice}"));
使用參數取值用{UpPrice}
3.5.2、 URL編碼與解碼
URL=http://www.baidu.com/s?wd=%E6%B5%B7%E6%B7"中要對%E6%B5%B7%E6%B7進行參數化,但是由“值”進行URL編碼過來的,無法直接用中文參數化,由於LR提供了方法,現在要將中文進行URL編碼。
解決方法如下:
URL編碼:
lr_convert_string_encoding("值",LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8 , "UnicodeString");
lr_save_string (lr_eval_string("{UnicodeString}"),"nURLencoder" );
web_convert_param("nURLencoder",
"SourceEncoding=PLAIN",
"TargetEncoding=URL",
LAST );
lr_output_message("Url編碼 = %s",lr_eval_string("{nURLencoder}"));
URL解碼:
lr_save_string (lr_eval_string("{nURLencoder}"),"URLencoder" );
web_convert_param("URLencoder",
"SourceEncoding=URL",
"TargetEncoding=PLAIN",
LAST );
lr_convert_string_encoding(lr_eval_string("{URLencoder}"),LR_ENC_UTF8 ,LR_ENC_SYSTEM_LOCALE, "UnicodeString1");
lr_output_message("Url解碼 = %s",lr_eval_string("{UnicodeString1}"));
3.5.3、 Base64加密與解密
base64加密:參數化GUID={97FD2AD5-1C5E-43F6-8314-FC980CE54FBC}
void GetBase64Encode(const char* in_str,char* out_str)//加密方法
{static unsigned char base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int curr_out_len = 0;
int i = 0;
int in_len = strlen(in_str);
unsigned char a, b, c;
out_str[0] = '';
if (in_len > 0)
{while (i < in_len)
{a = in_str[i];
b = (i + 1 >= in_len) ? 0 : in_str[i + 1];
c = (i + 2 >= in_len) ? 0 : in_str[i + 2];
if (i + 2 < in_len)
{out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
out_str[curr_out_len++] = (base64[((a << 4) & 0x30) + ((b >> 4) & 0xf)]);
out_str[curr_out_len++] = (base64[((b << 2) & 0x3c) + ((c >> 6) & 0x3)]);
out_str[curr_out_len++] = (base64[c & 0x3F]);}
else if (i + 1 < in_len)
{out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
out_str[curr_out_len++] = (base64[((a << 4) & 0x30) + ((b >> 4) & 0xf)]);
out_str[curr_out_len++] = (base64[((b << 2) & 0x3c) + ((c >> 6) & 0x3)]);
out_str[curr_out_len++] = '=';}
else{
out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
out_str[curr_out_len++] = (base64[((a << 4) & 0x30) + ((b >> 4) & 0xf)]);
out_str[curr_out_len++] = '=';
out_str[curr_out_len++] = '=';}
i += 3;}
out_str[curr_out_len] = '';}}
Action()
{ char * take;
char * toke;
char res[512];
take=(char *)strtok(lr_eval_string("{GUID}"),"{");//格式化“{”字符串
toke=(char *)strtok(take,"}");//格式化“}”字符串,並將值存入toke中
lr_error_message("GUID: %s",toke);
GetBase64Encode(toke,res);//調用base64函數
lr_output_message(res);
return 0;
}
四、運行設置(Run-time Settings)
4.1、General(常規)
Run Logic(運行邏輯)
Pacing(迭代)
Start new Lteration:開始新迭代
As soon as the previous iteration ends:在前一次迭代結束後立即開始
After the previous iteration ends:在前一次迭代結束後延遲
Log(日誌)
Enable logging:啓動日誌
Send messages only when an error occurs:僅在出錯時發送消息
Always send messages:始終發送消息
Standard log:標準日誌
Extended log:擴展日誌
Parameter substitution:參數替換
Data returned by server:服務器返回的數據
Advanced trace:高級跟蹤
Think Time(思考時間)
Lgnore think time:忽略思考時間
Replay think time:使用思考時間
As recorded:按錄製時記錄時間
Multiply recorded think time by_:將錄製思考時間乘以_
Use random percentage of recorded think time:使用錄製思考時間的隨機百分比
Limit think time to _seconds:將思考時間限制爲多少秒
Additional attributes(其他屬性):略
Miscellaneous(其他)
Error Handing:錯誤處理
Continue on error:出現錯誤時仍繼續
Fail open transactions on lr_error_message:在lr_error_message上打開失敗事務
Generate snapshot on error:出現錯誤時生成快照
Multithreading
Run Vuser as a process:按進程運行Vuser
Run Vuser as a thread:按線程運行Vuser
Automatic Transactions
Define each action as a transaction:將每個Action定義爲一個事務
Define each step as a transaction:將每步定義爲一個事務
4.2、Network(網絡)
Speed Emulation(速度模擬):略
4.3、Browser(瀏覽器)
Browser Emulation(瀏覽器仿真)
Simulate browser cache:模擬瀏覽器緩存
Cache URLs requiring content(HTMLs):緩存網址需要的內容(HTMLs)
Check for newer versions of stored pages every visit to the page:每次訪問該頁時檢查已存儲頁的較新版本
Download non-HTML resources:下載非HTML資源
Simulate a new user on each iteration:每次迭代模擬一個新用戶
Clear cache on each iteration:在每一次迭代中清除緩存
4.4、Internet Protocol(Internet協議)
Proxy(代理服務器):略
Preferences(首選項)
Enable Image and text check:啓用圖像和文本檢查點
Hits per second and HTTP codes:每秒點擊次數和HTTP代碼
Pages per second (HTML Mode only):每秒頁數(僅HTML模式)
Response bytes per second:每秒響應字節數
Winlnet replay instead of Sockets(Windows only):WinInet重播,而不是套接字
File and line in automatic transaction names:自動事務名中的文件和行號
Non-critical resource errors as warnings:非關鍵資源錯誤
Save snapshot resources locally:在本地保存快照資源
Download Filters(下載篩選器):略
ContenCheck(內容檢查):略
4.5、Date Format Extension(日期格式的擴展)
Configuration(組態):略
五、場景設置(手工場景)
5.1、手工場景
5.1.1、集合點策略
Scenario(場景)→Rendezvous(集合點)→Policy(策略),內容如下:
Release when __% fo all Vuser arrive at the rendezvous:所有用戶中X%到達集合點時,釋放
Release when __% fo running Vuser arrive at the rendezvous:所有正在運行的用戶中X%到達集合點時,釋放
Release when __ Vuser arrive at the rendezvous:當X個用戶到達集合點時,釋放
Timeout between Vuser __ Sec:每個用戶到達集合點後等待下一個用戶的最長時間
5.1.2、Run-time Settings(此略)
主要關注:思考時間、迭代時間、緩存的設置
5.1.3、用戶數
選擇Scenario→convert scenario to the percentage mode(轉換場景的百分比模式)設置每個腳本所需要的用戶數
5.1.4、日誌
選擇Results→Results Setting,打開Set Results Directory設置:選擇日誌存放的目錄
Automatically create a results directory for each scenario execution:自動創建每個方案的執行結果目錄
Automatically overwrite existing results directory without prompting for confirmation:自動而不提示確認,覆蓋現有結果目錄
5.1.5、負載機
開啓需關閉防火牆,啓動Agent(程序Loadrunner→Tool→Loadrunner Agent Running Setting Configuration),查看80端口是否被佔用。同時開啓Network DDE和Network DDE DSDM服務
5.1.6、IP欺騙
使用IP欺騙時,本機的網卡需要處於非DHCP模式下
IP欺騙操作步驟:
首先打開Loadrunner中Tool菜單下的IP Wizard工具,輸入服務器IP
然後添加IP(一般採用B類地址,C類區域下只有255)
再使用IP Wizard工具將IP地址寫入網卡,重啓網卡完成生效
設置IP的運行模式:選中Controller中Tool菜單下的Expert mode模式,然後打開Tool菜單下的Options對話框,在General標籤中設置IP的運行模式(進程或線程)
在使用時,將Enable IP Spoofer選中:在Controller中Scenario菜單下的選中Enable IP Spoofer即可
5.2、目標場景
5.1.1、提供的5種目標
1、Virtual Users(虛擬用戶數)
2、Hits per Second(每秒點擊率)
3、Transaction per Second(每秒事務數)
4、Transaction Response Time(事務的響應時間)
5、Pages per Minute(每分鐘頁面的刷新次數)
5.1.2、Scenario Settings(場景設置)
1、Run Time是指當前目標達到後,需要運行的時間
2、Stop scenario and save results:未達到目標,場景停止運行
3、Continue scenario without reaching:未達到目標,場景繼續運行
4、Receive notification出現目標未達到時,提示信息
5.1.3、Load Behavior(負載生成)
1、Automatic:自動(每2秒運行50個用戶)
2、選擇Controller達到目標之前,場景運行的時間
3、選擇Controller達到定義的目標的速度(用戶數/點擊率/頁面數)
5.3、監控以及指標
5.3.1、服務器資源監控指標
CPU
ata-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
內存
磁盤
系統
進程
網絡
5.3.2、數據庫監控指標
SQL Server
Oracle
Mysql(MONyog、LR sitescope)
5.3.3、應用服務監控指標
IIS
Apache
WebLogic
六、結果分析
6.1、應用服務器出現瓶頸的原因
應用服務器配置不當。比如緩存、超時時間、保持連接等各種屬性的設置等。
系統資源。比如內存、CPU、磁盤性能不足。
6.1.1、內存不足
監控Available Mbytes、Page read/sec、Page Faults/sec以及%Disk Time
MemoryPage Reads/Sec:持續大於5,可能存在內存不足
MemoryPage/sec:大於80,內存可能存在問題
PhysicalDisk%Disk Time:大於80,內存可能存在問題。當內存不足時,有點進程會轉移到硬盤上去運行,造成性能急劇下降,而且一個缺少內存的系統常常表現出很高的CPU利用率,因爲它需要不斷的掃描內存,將內存中的頁面移到硬盤上。
6.1.2、內存泄露
監控Available bytes、Private Bytes、Working Set以及%Disk Time
如果ProcessPrivate Bytes計數器和ProcessWorking Set計數器的值在長時間內持續升高,同時MemoryAvailable bytes計數器的值持續降低,則很可能存在內存泄漏。
6.1.3、CPU瓶頸
監控Processor Queue Length、%Processor Time以及Context Switches/sec
如果System/Processor Queue Length顯示的隊列長度持續>=2,並且處理器的利用率Processor /%Processor Time大於80%(95%),可能處理器存在瓶頸(一定是CPU瓶頸)。如果此時Processor /%Processor Time一直很低,可能是由於處理器阻塞引起。
6.1.4、磁盤問題
監控Disk Reads/sec、Disk Writes/sec、Current Disk Queue Length、% Disk Time以及LogicalDisk % Free Space
Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec頁面讀取操作速率很低,可能存在磁盤瓶頸。
Current Disk Queue Length 和 % Disk Time 的值始終較高,可能磁盤存在瓶頸。可以考慮升級磁盤驅動器或將某些文件移動到其他磁盤或服務器。
6.2、程序代碼出現瓶頸的原因
服務器資源的不合理使用。如內存的申請和釋放等。
採用了不合理的數據結構或者陳舊的調用。
數據庫查詢語句編寫上的不合理。
網頁文件尺度過大。
代碼邏輯的缺陷。
6.2.1、程序問題
監控throughout、%Processor Time以及context switches/sec
如果系統由於應用程序代碼效率低下或者系統結構設計有缺陷而導致大量的上下文切換(context switches/sec顯示的上下文切換次數太高),那麼就會佔用大量的系統資源,如果系統的吞吐量降低並且CPU的使用率很高,並且此現象發生時切換水平在15000以上,那麼意味着上下文切換次數過高
6.2.2、利用VS_Profiler分析程序
安裝配置VS_Profiler
安裝(略)
配置環境變量:PATH://安裝路徑
VS_Profiler的操作步驟
打開DOC命令窗口,進入Profiler.exe程序安裝的目錄
啓動Profiler環境:VSPerfCLREnv /sampleon
輸入VSPerfCmd/start:sample/output:PeopleTraxReport.vsp/launch:PeopleTrax.exe
通過VSPerfCmd開始分析PeopleTrax.exe程序,並探查器過程開始把收集的分析數據寫入報告peopleTraxReport.vsp文件。
注:如果要測試代碼級的性能問題,需開發提供PDB類型文件,如果不能提供,只能定位到API接口,而不能精確到具體函數方法的代碼級的情況
測試完畢後。關閉分析程序:VSPerfCmd/shutdown或VSPerfCLREnv/sampleoff或VSPerfCLREnv/globaloff
查看文件是否生成:dir 文件名
啓動Visual Studio 2010,將生成文件PeopleTraxReport.vsp直接導入。
原理:通過Visual Studio的IDE打開文件並分析. 打開PeopleTraxReport.sdp命令如下:VSPerfReport <dir> PeopleTraxReport.vsp /output:<dir> /summary:all
七、資源調優方法
7.1、CPU問題
考慮使用更高級的CPU代替目前的CPU
對於多個CPU,考慮CPU之間的負載分配
考慮在其他體系上設計系統,例如增加前置機、設置並行服務器等
7.2、內存和高速緩存
內存的優化包括操作系統、數據庫、應用程序的內存優化
過多的分頁與交換可能降低系統的性能
內存分配也是影響系統性能的主要原因
保證保留列表具有較大的鄰接內存塊
調整數據塊緩存區大小(用數據塊的個數表示)是一個重要內容
將最頻繁使用的數據保存在存儲區中
7.3、磁盤(I/O)資源問題
磁盤讀寫進度對數據庫系統是至關重要的,數據庫對象在物理設備上的合理分佈能改善性能磁盤鏡像會減慢磁盤寫的速度
通過把日誌和數據庫對象分佈在獨立的設備上,可以提高系統的性能
把不同的數據庫放在不同的硬盤上,可以提高讀寫速度。建議把數據庫、回滾段、日誌放在不同的設備上
把表放在一塊硬盤上,把非簇的索引放在另一塊硬盤上,保證物理讀寫更快。
7.4、調整配置參數
包括操作系統和數據庫的參數配置
並行操作資源限制的參數(併發用戶的數目、會話數)
影響資源開銷的參數
與I/O有關的參數
7.5、應用系統網絡設置
可以通過數組接口來減少網絡呼叫。不是一次提取一行,而是在單個往來往返中提取10行,這樣效率較高
調整會話數據單元的緩衝區大小
共享服務進程比專用服務進程提供更好的性能
八、SQL調優
8.1、調優的原則
在應用系統的設計、開發過程中,應始終把性能放在考慮的範圍內。
確定清晰明確的性能目標是關鍵。
必須保證調優後的程序運行正確。
性能更大程度是取決於良好的設計,調優技巧只是一個輔助手段。
調優過程是疊代漸進的過程,每次調優的結果要反饋到後續的代碼開發中去。
性能調優不能以犧牲代碼的可讀性和維護性爲代價。
8.2、調優的方法
類似where條件中的具體內容都可以修改爲參數化,減少SQL語句的解析次數。
將SQl語句中“*”修改爲具體的字段名稱
在同一業務中出現兩個相同的語句,建議刪除一個。如果作用相同,建議取消一個。如果不能取消,這兩個命令最好格式和內容完全一致,這樣相同的語句執行兩次,利用緩衝就可以減少解析次數。
更新表中的字段時,條件可以通過唯一主鍵就可以定位具體的記錄,而不需要所以的條件。建議將冗餘的條件刪除。
減少數據連接和WCF的調用。
如果是複合索引,只有在它的第一列(leading column)被where子句引用時,優化器纔會選擇使用該索引。
避免在索引列上使用空值。
在子查詢裏用exists替代IN,性能效率會得到提高,用表連接的方式比用exists的性能會得到提高。
儘量多使用COMMIT(該命令用於把事務所做的修改保存到數據庫)的操作,程序性能得到提高,需求也會因COMMIT所釋放的資源而減少。
8.3、數據庫出現瓶頸的原因
索引設計不合理
內存容量受限制
數據庫表字段設計部合理
數據量大並且沒有采取一定措施進行分庫分表
數據庫配置問題(見常用數據庫的配置)
8.4、SQL調優的思路
一般數據庫的操作時間都是執行時間和等待時間,在無法估計執行時間的時候主要看等待時間,等待時間又分2種:鎖等待時間和資源等待時間。
首先,用Sys.dm_os_wait_stats動態性能視圖,查看主要的狀況。如果Pageiolatch_sh等待很大,那說明Session在等待Buffer Pool的頁。如果在一個Session中要Select一些數據,但這些數據剛好沒有在Buffer Pool中,那麼SQL Server就會分配一些緩存,這些緩存是屬於Buffer Pool的,用來存放磁盤讀取的數據,而在讀取的時候都會給這些緩存上Latch(鎖),當存在IO瓶頸的時候,那麼磁盤上的數據就不能立即讀到Buffer Pool中,就會出現等待Latch的情況。
原因:可能是IO過慢,頁可能是在做一些多餘的IO造成的。
接下來查看Sys.dm_io_virtual_file_stats性能視圖來確定哪個數據庫造成了這麼大的延遲,並且通過Physical Diskavg.disk reads/sec和avg.disk writes/sec來確定到底數據庫有多少IO負載。
其次,通過Sys.dm_exec_query_stats查看執行計劃,在通過查看高物理讀的SQL和執行計劃看下有沒有優化的空間。如添加索引,修改SQL,優化引擎訪問數據的方法。
這時,可能SQL語句已經不能再優化了,但是性能還是不行。往往這種SQL是保鏢查詢類的SQL,會從磁盤中讀取大量數據,而很多數據往往在Buffer Pool中找不到,就會發生大量的PageIOLatch_sh等待,此時,我們要看下是否由於內存不足造成的,用Perfmon查看Page file expectancy(頁壽命長度),Free list stalls/sec(等待空頁的次數)和Lazy writes/sec。如果Page file expectancy波動很厲害,Free list stalls/sec一直大於0,且Lazy writes/sec的量也很大,說明Buffer Pool不夠大,但是也可能是SQL寫的不嚴謹,Select很多沒有必要的數據。
誤區:有時根據Sys.dm_io_virtual_file_stats和一些性能指標,很容易斷定IO問題。IO性能不理想,很有可能是Miss index或Buffer Pool的壓力造成的。如果只添加硬件設備,往往當數據量增大後,問題依然出現。
8.5、SQL常用的語句
SET STATISTICS IO ON:檢查查詢所產生的讀和寫
SET STATISTICS TIME ON:檢查查詢的運行時間
SET SHOWPLAN:分析查詢的計劃
DBCC FREEPROCCACHE與DBCC DROPCLEANBUFFERS:清除數據庫緩存
Select DATABASEpRoPERTYEX('DatabaseName','IsBrokerEnabled'):驗證是否開啓緩存
開啓數據庫緩存依賴:
ALTER DATABASE DatabaseName SET NEW_BROKER WITH ROLLBACK IMMEDIATE
ALTER DATABASE DatabaseName SET ENABLE_BROKER
AppAllowDebugging(默認:False)
九、常用應用服務器
9.1、IIS
9.1.1、ASP中IIS性能配置
修改Metabase.XML(C:WINDOWSsystem32inetsrvMetabase.xml)文件提升IIS的性能
作用:指定在服務器上能否啓用Active Server Page(ASP)調試
當允許執行服務器端調試時,將串行化IIS運用程序線程,對於每個運行程序,同一時間只允許運行一個線程。這會影響繁忙站點的服務器性能。
AspBufferingOn(默認:True)
作用:該屬性指定ASP運用程序的輸出能不能須要緩存。
AspQueueConnectionTestTime(默認:10)
作用:IIS將所有的ASP請求放置到隊列中。
如果請求在隊列中等待的時間比AspQueueConnectionTestTime屬性指定的時間長,則ASP將在執行請求前檢查確定客戶端是否仍連接。如果客戶端已斷開連接,則不處理該請求並且從隊列中刪除該請求。
AspRequestQueueMax(默認:3000)
作用:該屬性指定了允許進入隊列的併發ASP請求的最大數目。
當隊列佔滿時,任何試圖請求ASP文件的客戶端都將收到HTTP500信息。
AspScriptEngineCacheMax(默認:250)
作用:該屬性指定了ASP頁面將在內存中保存緩存的腳本引擎的最大數目。
AspScriptFileCacheSize(默認:500)
作用:該屬性指定了要緩存的預編譯腳本文件數。(0爲不緩存任何腳本文件)
AspSessionMax(默認:4295967295【0xFFFFFFFF】)
作用:屬性指定了IIS允許的最大併發會話數。
當達到該值的限定時,客戶端將接收到HTTP500信息。
AspSessionTimeout(默認:20分鐘)
作用:屬性指定了完成最後的Session對象有關的請求後,保留該對象的時間。
AspProcessorThreadMax(默認:25)
作用:該屬性指定IIS可建立的每個處理器的最大工作線程數。
AspTrackThreadingModel(默認:False)
作用:該屬性指定了IIS能否檢查運行程序建立的任意組件的線程模塊
CacheISAPI(默認:True)
作用:該屬性指示在第一次運用ISAPI擴展後能否在內存中執行緩存。
當該屬性配置爲False時,某些擴展不能正常運行,可能引起嚴重的性能問題。
9.1.2、IIS屬性的性能配置
禁止多餘的Web服務擴展
IIS支持多種服務擴展,有些擴展存在漏洞容易被攻擊者利用,原則將不用的擴展禁止
操作:打開“IIS管理器”→點擊“Web服務擴展”,在右側選擇相應的擴展,禁止即可
刪除不必要的IIS擴展名映射
IIS默認支持.asp、.cdx等8中擴展名的映射。有些擴展(如.asa、.cer等)存在安全隱患,可以被攻擊者利用來獲得Webshell
操作:打開“IIS管理器”→右鍵“默認站點”選擇屬性→點擊“主目錄”選項卡→點擊“配置”,打開應用程序配置窗口,根據需要選擇刪除不必要的應用程序映射
取消訪問記錄
IIS默認開啓對Web的訪問記錄,比如訪問時間、客戶端IP、Cookiesd等
操作:打開“IIS管理器”→選擇具體的Web站點→右鍵選擇屬性→點擊“主目錄”選項卡→取消對“訪問記錄”的勾選即可
對訪問流量進行限制
默認情況下IIS對訪問量是沒有限制的,如果併發連接過大超過了Web的負載則發生網絡擁塞,重則導致服務器宕機
操作:打開“IIS管理器”→選擇具體的Web站點→右鍵選擇屬性→選擇“性能”選項卡→對最大帶寬進行設置。同時可對“網絡連接”進行連接限制的設置
讓Web負載自由伸縮
默認情況下IIS是全負荷地爲Web提供服務的,在一定程度上加重了Web負擔。利用IIS的Web園,指定用於某個應用程序池的工作進程的數量就可以實現各個Web站點之間的隔離。
操作:打開“IIS管理器”→選擇具體的應用程序池→右鍵選擇屬性→點擊“性能”選項卡→在“Web園”中可對“最大工作進程數”進行設置,IIS在一定時間後(默認20分)自動縮減實際的工作進程數量。
配置應用程序池
創建:打開“IIS管理器”→右鍵“應用程序池”→選擇“新建-應用程序池”
指派:打開“IIS管理器”→選擇需要爲其指派應用程序池的站點→右鍵選擇屬性→點擊“主目錄”選項卡→在“應用程序設置”中選擇相應的應用程序池即可
回收:打開“IIS管理器”→選擇具體的應用程序池→右鍵選擇屬性→選擇“回收”選項卡→根據實際需要進行設置即可
MIME類型配置
網站嵌入了SWF和FLV格式,無法正常運行flash時。
.flv是Flash媒體播放器支持的視頻格式。但部分服務器需要進行MIME 類型映射設置,才能支持.flv視頻格式
操作:打開“IIS管理器”→選擇具體的Web站點→右鍵選擇屬性→選擇“HTTP頭”選項卡→點擊“MIME類型”→新建
(擴展名:.flv MIME類型:flv-application/octet-stream)
(擴展名:.SWF MIME類型:flv-application/octet-stream)
9.1.3、修改註冊表鍵值提升IIS性能
通過修改註冊表的值提升IIS的性能(切記:備份和重啓喲)
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesInetInfoParameters
DisableMemoryCache(默認:0已禁用)
作用:禁用服務器緩存
範圍:0-1
注:如果配置爲1,就會禁用靜態文件緩存
MemoryCacheSize(默認:物理內存的一半)
作用:高速緩存的大小
範圍:從0到4GB,缺省值爲3072000(3MB)
注:如果服務器網絡通信繁忙,並且有足夠的內存空間,可以考慮增大該值
MaxCacheFileSize(默認:256KB)
作用:確定可以放在緩存中的文件的最大的大小
注:IIS不緩存大於MaxCacheFileSize字節的文件
MenCacheSize(默認:可用物理內存的一半,以兆字節爲單位)
作用:指定IIS用來作爲其文件緩存的內存的最大量
範圍:0-2500MB
注:如果註冊表中沒有此值,IIS用作緩存的量不超過可以內存的一半(每隔60秒動態計算出來的)。如果不需要這麼多的內存,可以留給其他程序運用
ObjectCacheTTL(默認:30秒,不包括在註冊表中,必須手動添加)
作用:指控靜態文件緩存的生存時間(TTL)配置,該配置定義對象(包括文件)存放在緩存中的時間長短
範圍:0-4294967295(無限定)
PoolThreadLimit(默認:2 * # MB)
作用:PoolThreadLimit指定可以在Inetinfo.exe進程中建立的I/O工作線程的最大數量,該配置將限定同時連接的數量
範圍:0-4294967295(無限定)
MaxPoolThreads(默認:4)
作用:MaxPoolThreads指定爲每個處理器建立的I/O工作線程的數量
範圍:0-4294967295(無限定)
注:該計數不包括ISAPI程序運用的線程
ListenBacklog(默認:15)
作用:指定在隊列中允許的等待服務器處理的活動連接的最大數量
範圍:1-250
9.1.4、在服務器配置上優化IIS性能
打開“網絡連接”→右鍵“本地連接”→選擇屬性→在使用項目中選擇“Microsoft網絡”→點擊“屬性”,在服務器優化中選擇最大化網絡應用程序,點擊“確定”即可
9.1.5、優化IIS的注意事項
爲了提高性能和節約資源,應該只運行需要的協議。這一點很多管理員都沒有注意,筆者曾見到在一臺只作Web服務的機器上同時安裝有NetBEUI、Tcp/IP和IPX協議。顯然這是不合理的。
應該將IIS服務器,設置爲獨立的服務器,不要讓服務器去承受域控制器要求的額外負荷。試想:服務器一邊在響應用戶的登錄,一邊還要提供IIS服務,性能能不下降嗎?
可以把NT服務器的頁交換文件分佈到多個物理磁盤上,注意是多個“物理磁盤”,分佈在多個分區上是無效的。另外,不要將頁交換文件放在與WIndows NT引導區相同的分區中。
使用磁盤鏡像或磁盤帶區集可以提高磁盤的讀取性能。
關於日誌的記錄,應該採用文件記錄而不是記錄到ODBC數據源。此外,還可以在記錄期間增加用來記錄日誌的內存緩衝區的容量來減少磁盤的活動。該緩衝區的缺省容量值爲64KB。
最好把所有的數據都儲存在一個單獨的分區裏。然後定期運行磁盤碎片整理程序以保證在存儲Web服務器數據的分區中沒有碎片。使用NTFS有助於減少碎片。筆者推薦使用Norton的Speeddisk,可以很快地整理NTFS分區。
雖然SSL可以提供相當可靠的加密傳輸。但是所需的額外開銷會導致IIS服務器速度下降,尤其是在處理大型文件的時候。所以應該只對確實需要保護的目錄進行SSL加密。
9.2、Tomcat
9.3、Apache
9.3.1、windows的安裝配置
修改網站的發佈路徑(conf/httpd.conf)
將配置文件中“DocumentRoot和Directory”的值修改爲指定路徑
設置啓用PHP功能(phpapache.dll)
在文件中LoadModule後面添加:
LoadModule php_module “phpapache.dll的路徑”
添加後綴名爲php的支持
在AddType後面添加AddType application/x-httpd-php .php
添加默認文檔index.php,default.php
在DirectoryIndex中添加DirectoryIndex index.html index.php default.php
注:Serversignature安全設置,默認情況下,在安裝時這些信息都是可見的。所以請加入下面兩條:Serversignature off和Serversignature prod
9.3.2、windows中性能優化參數配置
Hhostnamelookups off
作用:域名查找。首先服務器會對DNS系統做一個反向查詢以找出客戶系統的主機名,然後又進行正向查詢獲取主機名是否真實指向客戶的IP
options – followsymlinks
作用:關閉符號連接。
注:如果開啓此功能,在apache每個請求中包含的每個路徑調用一次istat()系統調用。
Sethandler server –status
作用:服務器狀態信息(默認是關閉的)
options –indexes
作用:關閉目錄瀏覽
directoryIndex index.php index.html
作用:通配符的設置
注:建議將最常用的放在最前,刪除不需要的選項
timeout
作用:等待連接的時間(一般設置爲5-10秒)
Keepalive off
作用:是否進行長連接。
注:如果是下載類的應用,因爲連接時間比較長,建議開啓
如果是網頁類應用(圖標、js、css、圖片等),建議關閉
Maxkeepaliverequests(一般設置100-200)
作用:保持多少個長鏈接
Keepalivetimeout(一般設置5-15秒)
作用:連接保持的時間,超過設定就回收
MPM模塊
多處理方式(multi-processing module)允許特定平臺處理多個併發連接
Prefork的工作原理及配置
工作原理:控制進程在最初建立“StartServers”個子進程後,爲了滿足“MinSpareServers”設置的需要創建1個進程,等待1秒鐘繼續創建2個進程,在等待1秒繼續創建4個….依次按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值爲止。這就是預派生(prefor)的由來。
配置:在apache的配置文件找到下面一段配置
<IfModule mpm_prefor_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
MaxSpareServers設置了最大的空閒進程數,如果空閒進程數大於這個值,apache會自動Kill掉一些多餘進程。如果設置的值比MinSpareServers小,apache會自動把其調整爲MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers
MaxRequestsPerChild設置的是每個子進程可處理的請求數,每個子進程在處理了“MaxRequestsPerChild”個請求後將自動銷燬。.0意味着是無限,即子進程永不銷燬。設爲0可以使每個子進程處理更多的請求同時又兩點重要的好處:a、可防止意外的內存泄露;b、在服務器負載下降的時候會自動減少子進程數。
因此,可根據服務器的負載來調整這個值,但也不能太小(不斷開啓新的apache進程,造成資源浪費)。
MaxClients是最重要的一個,設定的是apache可以同時處理的請求,是對apache性能影響最大的參數。可根據硬件配置和負載情況來動態調整這個值。
Worker的工作原理及配置
工作原理:由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的“ThreadSperChild”線程數,各個線程獨立地處理請求。同樣,爲了不在請求到來時再生成進程,MinSpareThreads和MaxSpareThreads設置了最少和最多的空閒線程數;二MaxClients設置了所有子進程中的線程數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
配置:在apache的配置文件找到下面一段配置
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChlid 25
MaxRequestsPerChild 0
</IfModule>
MinSpareThreads和MaxSpareThreads參數對apache的性能影響並不大,可以按照實際情況做相應調節。
ThreadsPerChlid是worker mpm中與性能相關最密切的指令。如果負載較大,需要使用ThreadsLimit指令來調節該指令的大小。
9.3.3、linux的安裝配置
配置系統啓動時自動啓動apache服務
在/etc/rc/d/rc.local上添加/usr/local/apache/bin/apachectl -k start
在http.conf配置文件中修改參數
設置根目錄的路徑
根目錄是指apache存放配置文件和日誌文件的目錄,配置參數爲ServerRoot,默認位於“/usr/local/apache”
設置系統管理員E-mail
使用ServerAdmin參數設置
設置服務器主機名稱
使用ServerName參數設置主機名稱
設置監聽IP地址及端口號
使用Listen 80參數進行監聽(默認端口80)
設置主目錄的路徑
使用DocumentRoot參數來配置路徑
設置默認文件
Apache的默認文件名爲index.html,使用Directory Index參數來配置文件
9.4、WebLogic
9.5、JBoss
十、Loadrunner常用的函數