Redmine export performance tracing and resolution

环境: bitnami redmine 3.3.0 on win7(x32), mysql 5.6.32 for win32, 4G物理内存, ruby 2.1.8, rails 4.2.6

问题: 因为自定义字段数量较多,导出issues时,如果事务数量过多,会出现502 Proxy Error提示,如下图。

image

解决:

1、修改apache proxy超时时间

在Bitnami edmine-3.3.0-0apps edmineconfhttpd-prefix.conf文件里增加:

ProxyTimeout 300

因为通过服务器集群设置来完成负载均衡,3001和3002端口为两个不同的thin服务器,8080端口收到http请求时,代理给服务器集群中的服务器进行处理,上述参数为等待代理应答的超时时间,设置为300s.如thin服务器在300s内未处理完,则8080返回浏览器502 Proxy Error。

该参数默认为60,即60s超时。 设置为300s后,小于5分钟的export可以成功。

2、优化mysql缓存

在Bitnami edmine-3.3.0-0mysqlmy.ini文件中[mysqld]段里增加:

innodb_buffer_pool_size = 1073741824 
tmp-table-size = 200M
join-buffer-size = 1M
query-cache-size = 16M
innodb-buffer-pool-instances = 1 # The MySQL Documentation suggests 1G per buffer pool instance, innodb_buffer_pool_size should be 2G
slow-query-log = TRUE
long-query-time = 5 # 5s
#query-cache-type = TRUE
query-cache-limit = 4M

其中innodb_buffer_pool_size标识缓存大小,可以明显加快访问速度,可以设置为物理内存的50%;innodb-buffer-pool-instances可以提高mysql的并发能力,官方文档建立每个实例每个对应1G的缓存大小,即innodb_buffer_pool_size = innodb-buffer-pool-instances * 1G。

在不同机器上设置后,超过5分钟的export仍然不能解决,且因为数据量大、不能保证thin服务器在5分钟内完成export任务。

3、追踪CPU和内存变化

1)CPU和内存初始状态

image

初始时CPU占用率接近0,内存占用固定,mysqld提交1.5G,实际专用内存560MB;ruby.exe内存140MB。

2)export数据库操作

image

开始export后,mysqld的CPU占用率25%(4核CPU中的1核),持续5s左右,下降为0%;

3)export生成csv文件:

数据库查询完成后,ruby.exe进程开始占用25%CPU资源:

image

同时ruby.exe请求的内存资源快速增长,从开始的不到200M增长到1.5G:

image

此后ruby.exe对CPU和内存的资源持续占用,CPU占用率25%左右(4核CPU中的1核)、内存请求一直增长,直至浏览器返回502 Proxy Error。之后ruby.exe继续申请内存,直至1.9G,使得mysql等其它进程的专有内存持续减少。 有一定概率会导致Thin服务器自动退出运行。

在导出过程中,其它web查询访问均不会响应,在ruby.exe的CPU占有率下降后才响应。

4)分析结论

整个过程中,mysqld.exe除了在查询时持续5s左右的25%CPU占有率,其它时间CPU占有率比较固定;内存占用一直比较固定。总体查询较快。

瓶颈在ruby.exe进程,Thin服务器处理csv生成耗时长,且最后会导致ruby.exe异常退出。总体csv文件生成慢。

Thin服务器自动退出运行可能和申请不到内存有关。

5)解决方案

提高ruby.exe多核并行处理能力;

找到redmine中csv文件的生成过程和性能瓶颈,如堆栈嵌套过多、计算量偏大等。

todo:在公司服务器上验证上述过程; 增加内存可以保证ruby.exe获得内存,提高多核处理能力可以加速处理,优化生成过程可以减少资源需求。

原文地址:https://www.cnblogs.com/lustforlife/p/7927262.html