大型RAILS應用(網絡考試)性能測試與調優過程

發表于:2008-07-14來源:作者:點擊數: 標簽:性能測試網絡考試應用RAILS
一 背景介紹 系統為上海一家IT公司rail on ruby 快速 開發 出來的 網絡 考試系統。核心功能:登錄、考試??荚嚪譃閔tml的單/多選題,flash展現的操作題。在內部一次模擬考試中,系統曾經出現性能故障,導致無法正常做題。 二 系統架構分析 接到 性能測試 任務

一 背景介紹

  系統為上海一家IT公司rail on ruby快速開發出來的網絡考試系統。核心功能:登錄、考試??荚嚪譃閔tml的單/多選題,flash展現的操作題。在內部一次模擬考試中,系統曾經出現性能故障,導致無法正常做題。
  
二 系統架構分析

 接到性能測試任務,第一感覺:要很注意每一個細節,包括用戶行為模擬、場景設計合理全面等。
 
 咨詢了解到系統架構為: ruby+rails+ apache2.x+mysql5。
 
 登錄系統:登錄web與登錄的DB分開
 考試系統:考試web與考試DB 集中部署在一臺機器上。答一道題目即插入數據庫


三 用戶行為分析

1 考試要求在 0~45分鐘內考試完畢
2 多數考生一般先做選擇題,再做操作題;少部分反之。
3 多數考生做完全部題目,少部分考生中途就提交結束答卷
4 題目可以回退或者選擇任意一題目修改答案
5 同一個考生在提交答卷后,不能再答題

由于系統更加細致的數據沒有log分析,就簡單采用80-20原則隨機模擬。

四 腳本開發小技巧
1  隨機模擬腳本
init.c 加入 srand(time(NULL));

action.c 加入  rand() % 100;
 
2 cookie處理

服務器端檢查cookie信息。
加入web_add_auto_header 確保后續每一個http請求都自動把cookie加入header

3 并發處理
由于一次性考試,故并發數沒有按考試人數縮放,但考試按照一定的隨機think time等待。
 
五 系統調優

 主要的線索是environment.rb定義的config.log_level 生成product.log,
以及rail bench。

(一) 精簡登錄首頁
 
1 登錄:削減登錄網頁,很輕量級,僅僅包含Login 窗口

(二) flash下載模式變更
 原來做操作題目,該flash操作題才下載到客戶端。
為了減輕并發下載flash的網絡流量壓力,變更為在登錄成功后,客戶端javascrīpt采用ajax技術(xmlhttpquest)隨機1-60秒內后臺主動下載flash試題到客戶端。改變網絡流量瞬間飆升的情況。

(三) apache2.0 調整httpd.conf 關鍵參數以及加載mod_proxy 、mod_mem_cache

1 apache httpd work mpm模式。
增加 MaxClient。

<IfModule worker.c>
StartServers         2
ServerLimit         2500
MaxClients         2500
MinSpareThreads     75
MaxSpareThreads     255
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>


2 上apache 負載均衡模塊 mod_proxy

ProxyRequests off

<Proxy balancer://kaoshi>
BalancerMember http://localhost:6000
BalancerMember http://localhost:6001
BalancerMember http://localhost:6002
BalancerMember http://localhost:6003
BalancerMember http://localhost:6004
BalancerMember http://localhost:6005
</Proxy>
ProxyPass /images !
ProxyPass /stylesheets !
ProxyPass /javascrīpts !
ProxyPass /expert_photos !
ProxyPass /uploads !

ProxyPass / balancer://kaoshi/
ProxyPassReverse / balancer://kaoshi/
ProxyPreserveHost on


3  LoadModule mem_cache_module modules/mod_mem_cache.so加載cache模塊

       CacheEnable mem /
       MCacheMaxStreamingBuffer 65536
       MCacheRemovalAlgorithm LRU
       MCacheSize 3000000
       MCacheMaxObjectCount 256000
       CacheIgnoreHeaders None
       CacheIgnoreCacheControl On
       MCacheMinObjectSize 1
       MCacheMaxObjectSize 2560000
       CacheDefaultExpire 10

 

(四)  rails 相關調整


1 變更默認連接器為C-based MySQL library mysql-2.7。
2  直接寫SQL不用activeRecord 接口。
3  修改mogrel 服務參數

mongrel_cluster.yml

cwd: /home/www/kaoshi/current
port: "6000"
environment: production
address: 0.0.0.0
servers: 7


4 rails負載均衡


[app@b2bsearch114 controllers]$ pwd
/home/app/download/match_export/app/controllers

class ExamsController < ApplicationController
  IPS = %w(10.0.6.91 10.0.6.91 10.0.6.91 10.0.6.91 10.0.6.91 10.0.6.91)

  def host
    index = (session["no"] || 1) %  IPS.size
    render :text => IPS[index]
  end

5 rails 部署Memcached緩存模塊


(五)  數據庫結構以及SQL 調優

調整MYSQL配置文件、以及增加部分字段索引之后,iowati%從20%下降到0.4%
祥見
http://nnix.blogbus.com/logs/14824821.html
/bin/sh /usr/bin/mysqld_safe --user=mysql

 [root@aligame etc]# vi my.cnf

[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 64M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
thread_concurrency = 8
query_cache_size = 64M
event_scheduler=1
lower_case_table_names=1
max_connections=200
back_log=512
default-character-set=utf8

log_slow_queries
log_long_format
long_query_time=1
server-id       = 1
#innodb_data_file_path = ibdata1:1025M;ibdata2:256M:autoextend
innodb_buffer_pool_size = 1024M
innodb_max_dirty_pages_pct = 90
innodb_additional_mem_pool_size = 16M
#innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50
innodb_file_io_threads = 4
innodb_thread_concurrency = 8

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

 

這 log_slow_queries,log_long_format,long_query_time=1 慢的查詢語句將被打印

在目錄下可見*slow.log文件記錄可能有性能問題的SQL


七 小結
 
   本次rails程序從應用程序調優、APACHE配置與調優、MYSQL索引與SQL優化多個細節提升性能。
調整從最顯著的一個瓶頸(apache Maxclient->Mysql SQL)開始的,一次僅調整一個。
  本次調優一個環節后,瓶頸從一個環節轉移到另外一個環節。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97