51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3474|回复: 5
打印 上一主题 下一主题

[原创] 大型RAILS应用(网络考试)性能测试与调优过程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-6-30 00:52:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
一 背景介绍

  系统为上海一家IT公司rail on ruby快速开发出来的网络考试系统。核心功能:登录、考试。考试分为html的单/多选题,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的网络流量压力,变更为在登录成功后,客户端javascript采用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 /javascripts !
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)开始的,一次仅调整一个。
  本次调优一个环节后,瓶颈从一个环节转移到另外一个环节。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

6#
发表于 2008-11-9 18:29:22 | 只看该作者
请问随机模拟脚本是什么意思 这地方没有想明白
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2008-7-2 12:52:26 | 只看该作者
采用apache 更多是由于apache在alibaba被证明是稳定的。并且SA对这个性能调优、故障诊断熟悉。

nginx也有公司组合用的
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2008-7-1 21:46:19 | 只看该作者
apache Maxclient->Mysql SQL 如果是 apache 的处理能力有问题,建议用nginx
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2008-7-1 20:26:10 | 只看该作者
在生产环境上运行良好。

由于答题的过程就是insert 为主的过程,对写操作要求高
回复 支持 反对

使用道具 举报

该用户从未签到

2#
发表于 2008-7-1 09:53:17 | 只看该作者
mysql的参数都设的很大了,机器硬盘性能不高的话反而会受参数的影响。
答一道题目即插入数据库表
都是插入多所以机器硬盘性能很必要有个基准。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-20 11:29 , Processed in 0.066683 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表