由于xwiki在线上运行出现性能问题,于是在本地利用docker搭建xwiki环境,并导入与线上同等量的数据,使用阿里巴巴的开源工具arthas进行调试
构建含有arthas的xwiki-docker镜像
arthas调试工具与被调试的程序需要运行在同一个环境下,因此需要在xwiki镜像中载入arthas,arthas的运行需要在jdk环境下,而xwiki的基础镜像是jre环境,jre环境没有需要运行arthas的tools.jar包,最终的解决办法是下载完整的jdk包,直接用./jdk1.8.0_201/bin/java -jar arthas-boot.jar
的方式启动arthas,还可以查看java进程pid,指定pid运行
1 | ps -A |
官方下载jdk包
Java SE Development Kit 8 Downloads
使用dockerfile构建镜像
1 | FROM registry.saas.hand-china.com/hitoa/xwiki:10.4-mysql-tomcat-0.14.0 |
在dockerfile所在目录下运行命令
1 | docker build -t hsqyz520/wiki-arthas:2.0 . |
上传镜像到docker hub
先在dockerHub注册一个账号
1 | 登录hub |
利用docker-compose启动xwiki
1 | version: '2' |
执行以下命令
1 | 启动 |
若想清空wiki数据,启动前先删除以下文件夹
若想关闭xwiki的choerodon认证,在
xwiki-data/data/xwiki.cfg
中注释掉认证类
数据导入
由于大数据量的sql在navicat中运行容易失败,这种情况下应该用命令行进入到mysql中执行sql源文件
1 | 进入容器 |
启动监听
在用docker-compose
启动容器运行wiki后,在xwiki的容器中启动arthas监听wiki
1 | docker exec -it ${xwiki容器Id} bash -c "./jdk1.8.0_201/bin/java -jar arthas-boot.jar" |
Arthas命令的使用
1 | 查看方法耗时 |
调试结果
这次调试的主要目标是刷新页面,通过定位代码,所有的请求都会经过XWikiAction.execute()
方法
1 | trace com.xpn.xwiki.web.XWikiAction execute |
主要耗时在parseTemplate()
解析模版上,通过调试发现,xwiki采用velocity模板来渲染前端的,view.vm下面有许多子vm,下面覆盖了许多层级的vm,这样导致一个页面要渲染的模版成倍数量,可能这里就是xwiki刷新慢的原因,因此我考虑了是否可以给velocity增加缓存,我参考了velocity配置优化,于是我在配置中添加velocity.properties = file.resource.loader.cache = true
将刷新页面的接口取到postman去压力测试,以便观察结果,需要设置Cookie,测试结果速度似乎有从平均600~800ms缩减至500~700ms,结果不是很明显
后面我到XWiki官方论坛提问,作者回复的大概意思是在XWiki中使用Velocity的方式,缓存弊大于利,后续版本会对这一块进行优化
至此后面只能考虑在渲染这一方面每个层级引入并发Stream,以及确定是否数据库sql的问题
idea远程监听调试tomcat中运行的服务
更改tomcat配置
打开/usr/local/tomcat/bin/catalina.sh
,增加如下配置,开放端口5005
1 | CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,suspend=n,server=y" |
docker-compose绑定卷和开放端口
1 | services: |