redmine服务器性能问题排查与优化建议:

以下建议的方案是基于redmine运行期的log文件中的render耗时、activerecord耗时,linux系统性能指标采样与 mysql 性能指标采样分析,以及redmine在不同web server下的benchmark而得:

一. 问题排查与定量分析

通过分析redmine运行期的log,对比mysql高峰时段的请求量与此时系统cpu、mem、disk、iowait等指标,以及我在本地的相同环境下的伪造并发量的性能测试结果,可以看出服务器中高峰时段并未有效利用cpu与内存. 最主要的4个原因是:

1. rails框架过于笨重,运行效率低,

2. 一个ruby进程只能利用单核cpu,其多线程受GIL所控,多线程效率较低,无法有效利用多核cpu,因此在高峰时段只有passenger进程占用的几个cpu满载,其余利用率基本为0。

3. 目前redmine的发布方式是apache+passenger, passenger没有进过优化,只开启了6个worker,而且只是进程级支持,这导致了iredmine服务器的吞吐量非常低。

4. mysql的运行模式没有进过优化配置,基本裸跑。

1.1 性能指标说明:

linux性能指标数据使用shell脚本来采集,已经存储,如需分析可以参考如下:

1. linux系统采样脚本:在~/performanceLog/collectLog.sh中,或者看这篇linux系统性能指标的采集博客;

采样结果在~/performanceLog下,以日期命名的文件中。

注: 如果以后想使用此脚本采集数据,如果mysql的地址或者目录有更换,此脚本中dstat 的mysql相关数据的采集需要重写其mysql连接部分的代码。

2. mysql的指标数据可以通过运行如下命令:

mycheckpoint --user=root --password=xxxx --socket=/redmine/mysql/tmp/mysql.sock --database=mycheckpoint http

针对不同web server的负载测试方法如下:

在量化性能时,本方案带来的的性能提升时,为了方便ab测试,建议关闭redmine代码中csrf保护,并利用session,自动登陆,以保证测试的地址有sql操作,确保测试过程包含sql请求,方法如下:

取消csrf保护方法:

找到redmine发布的代码中controller目录下的ApplicationController.rb文件,将其中的csrf保护函数protect_from_forgery中cookie.delete(auto_cookie_name)行注释掉。 (production模式记得调回来)

ab模拟并发测试步骤:

0.  ./ctlscript.sh stop apache

1.  使用puma -w 16 -t 16 -p 8080 /redmine/apps/redmine/htdocs/config.ru启动 redmine

2.  chrome浏览器,打开url, 查看inspect tools, 复制cookies

3.  使用ab工具: ab -n 800 -c 16  -H “Cookie: Key1=Value1; Key2=Value2”   http://localhost:8080/issues/48575

二:优化方案说明:

1. 并发量过大时反应慢的问题                                 #ok,使用multi-process * multi-thread的 web server

2. 数据库读写性能过低                                          #ok,打开mysql查询缓存等。

3. 使用异步io库em-Synchrony,提升IO吞吐量。      #failed, 经测试,不稳定,接口版本有时不匹配,需3.1以上版的rails。

4. 使用rubinus or jruby 提升执行性能                     #failed,经测试jruby 内存损耗太大, rubinus有兼容性问题。

5. 去除rails默认加载的非必需的middleware             #rails默认加载20多个中间件,有些是无需的。

进过以上几个步骤的优化调整,进过ab测试发现,吞吐量可以提升2到3倍, 负载能力也有提升,但没有去测极限数据。

三:web服务器优化建议:

建议使用多进程多线程版的puma替代多进程单线程passenger, 或者 任然使用passenger,但是配置成默认开启14个worker,方便高峰时段留两个cpu给mysql使用。 另外, 由于puma可以一定程度利用多线程来serve http请求,为了保证线程安全,需修改iredmine代码:

添加config.threadsafe!到config/enviroment目录下的production.rb文件中

# enable multithread, and keep thread safe.

config.threadsafe!

1. puma的使用: 启动14个工作进程*16个线程,提升吞吐率。

puma -w 14 -t 16 -p 8080 /redmine/apps/redmine/htdocs/config.ru

2. 配置passenger方法:

配置文件在:/redmine/apache2/conf/bitnami 目录下,添加以下:

PassengerMaxPoolSize 14

四:mysql服务器优化建议:

mysql的服务器优化主要依赖mycheckpoint采集的mysql性能指标可视化之后的分析,以及mysqltuner.pl的调优建议。

1. 在mysql的配置文件中开启一下设置(以下有两个变量设置后需要重启mysql):

Threads_cached  -> ON

thread_cache_size = 64;

query_cache_size (>= 8M)

join_buffer_size (> 128.0K)

tmp_table_size (> 16M)

max_heap_table_size (> 16M)

thread_cache_size (start at 4)

table_open_cache (> 800)

innodb_buffer_pool_size (>= 371M)

另外还有: thread_concurrency = 32;  (cpu*2)

关于mysql的用户请求压力情况,请查看http://172.26.1xx.xx:8080/mycheckpoint/

五:rails优化建议: 删除不需要的middleware

请联合目前redmine插件开发人员,根据当前rails的实际middleware使用情况进行筛选删除。

方法:可以在application configuration 文件中添加以下代码来删除。

# config/application.rb

config.middleware.delete "Rack::Lock"

config.middleware.delete 'Rack::Cache'                          # 整页缓存,似乎在redmine中没有用上。

config.middleware.delete 'Rack::Runtime'                      # 记录X-Runtime(方便客户端查看执行时间)

config.middleware.delete 'ActionDispatch::RequestId'     # 记录X-Request-Id(方便查看请求在群集中的哪台执行)

config.middleware.delete 'ActionDispatch::RemoteIp'      # IP SpoofAttack

config.middleware.delete 'ActionDispatch::Callbacks'       # 在请求前后设置callback

config.middleware.delete 'ActionDispatch::Head'             # 如果是HEAD请求,按照GET请求执行,但是不返回body

config.middleware.delete 'ActionDispatch::BestStandardsSupport' # 设置X-UA-Compatible, 在nginx上设置

等等。。

六: 去除production 模式下rails不需要的log 与 某些异常的修正。

1. 由于在production.log中发现了大段的debug模式才需要的log全部输出到了log文件中,耗时较长,建议删除。

2. 某些url出现了 runexception. 建议修正, 或者在 middleware中去除名称为:use ActionDispatch::ShowExceptions

use ActionDispatch::DebugExceptions

redmine mysql 优化_Redmine性能优化方案相关推荐

  1. oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...

    本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...

  2. MySQL模糊查询性能优化

    一.背景 我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 如果需要查找客户表中所有姓氏是"孙"的数据 ...

  3. 高性能Mysql之查询性能优化

    高性能Mysql之查询性能优化 为什么查询速度会慢 慢查询基础:优化数据访问 重构查询的方式 MySQL查询优化器的局限性 优化特定类型的查询 即使我们设计了一个最优的库表结构,建好了最好的索引,如果 ...

  4. 前端优化-前端性能优化

    最近前端群里的小伙伴问我,老板喊我做前端优化我该怎么去优化呢?.我思考了了一下,提出了以下几点建议- 文章目录 一.思考 二.可读性优化(不细讲) 1.模块化 2.组件化 3.文件规范 4.commi ...

  5. NEON优化:性能优化常见问题QA

    NEON优化:性能优化常见问题QA NEON优化系列文章: NEON优化1:软件性能优化.降功耗怎么搞?link NEON优化2:ARM优化高频指令总结, link NEON优化3:矩阵转置的指令优化 ...

  6. MySQL数据库---SQL语句优化及性能优化

    文章目录 mysql的架构图 mysql的执行过程 sql语句执行计划 索引失效的情况 mysql性能调优: 分库分表 读写分离---主从复制 mysql的架构图 大致分为4层:连接层.服务层.引擎层 ...

  7. mysql的limit性能优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  8. MySQL系列:性能优化

    1. 优化简介 MySQL性能优化包括:查询优化.数据库结构优化.MySQL服务器优化等. 2. 查询优化 2.1 分析查询语句 MySQL提供EXPLAIN和DESCRIBE,用来分析查询语句. E ...

  9. mysql not in优化_MySQL性能优化 — 实践篇2

    点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 MySQL索引底层数据结构与算法 ...

最新文章

  1. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)
  2. 合肥高校计算机协会联盟部门
  3. 22张图片倒叙霍金:我爱宇宙也爱这苦乐人生
  4. qq如何用其他进制登录
  5. pytorch 池化
  6. Spring+Netty4实现的简单通信框架
  7. 林祖宁《ISO20000-12011 认证合格判定基础》
  8. 主曲率,主方向,高斯曲率与平均曲率公式与matlab代码
  9. 著名的光伏系统设计——pvsyst7.2中文版
  10. Web全栈工程师修养
  11. Springboot启动流程详解
  12. 微信服务器 系统发生错误,微信系统故障 仍未修复
  13. pu膜刻字膜热转印膜在衣服上的烫印参数
  14. javaScript+css+html——键盘事件(通过键盘上下左右控制图形位置)
  15. 程序员系列头像表情包一
  16. 自控带宽频率等相关介绍
  17. 初学python心得1000字实训_数学教学1000字六年级心得大全
  18. it做形式主语的句子
  19. oracle实例的内存(SGA和PGA)的调整和优化(转载)
  20. MDX Aggregate函数

热门文章

  1. Android 需要学习的UI框架
  2. Gartner发布2020年中国ICT技术成熟度曲线
  3. 最新AI绘画矢量笔刷2100款大合集,支持AI2022版本
  4. 《谈判力》读书笔记 第四部分 结论
  5. 视频剪辑srt字幕的添加步骤,三分钟学会这个方法
  6. Debian下最简的添加ttf字体文件的方法(网络收藏)
  7. 微信小程序,配置web-view业务域名,文件检测失败
  8. android 简单实现沉浸式通知栏(透明通知栏)
  9. 小米青春版发售日期在5月18日
  10. markdown 文件如何实现 chm 文件打包