某用户使用smartbi实现了内部的实训平台,近期举办了实训大赛,平台使用的人较多,Smartbi服务近内存和CPU的消耗很大,过段时间平台就会崩掉,每天都要重启好多次。
Smartbi、MySQL知识库和业务库、挖掘引擎等相关组件都部署在一台服务器上。
最初服务器配置是32核128G,宕机后又升级到64核256G,虽然硬件配置提升了,但是只延缓了宕机的频率,依然并没有杜绝掉宕机的现象。
根据上图展示的阿里云ECS服务器监控情况来看,整个服务器运行压力比较大,内存使用率和系统负载都很高。
需要使用Top命令确定是那些服务占用了系统的资源,经排查发现是Smartbi的Tomcat进程占用资源最多,
下面需要对Smartbi的Tomcat进程做进一步分析。
命令:top -H -p pid
其中pid为Tomcat进程号,比如上图的20334
可以查看到很多线程占用CPU比较高,如果需要查看线程具体执行的代码逻辑需要通过如下操作
如果此时Smartbi页面可以正常访问,可以使用Smartbi内置的JSP页面来查看哪些线程占用CPU比较多。
访问地址举例:http://proj.smartbi.com.cn:30001/smartbi/vision/monitor/listthreads.jsp
加载此界面完成后Ctrl+S保存网页内容发回分析,可分析是哪个线程占用过高的CPU:
通过arthas工具监控发现Smartbi存在大量线程CPU使用率非常高。
3.2试试
经排查这些线程主要是对tx_processdag表进行全表遍历,tx_processdag大约有2.5万条记录,单独执行需要20s+才能够执行完毕,存在很大性能瓶颈。
在不同的操作系统上,my.cnf 文件的位置可能有所不同:
Windows: 通常位于 MySQL 安装目录下的 my.ini 文件。
Linux: 通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf,可以通过如下命令查看配置文件的查找路径
#/smartbi/mysql_8/bin/mysqld --verbose --help | head -30 |
---|
mysqld 默认会从 /etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf ~/.my.cnf 多个文件依次读取配置。
注1:如果某个参数在多个文件都有配置,那么就以最后读取到的那个参数值为准。
注2:可以使用命令行参数 defaults-file 指定配置文件,指定这个参数后,MySQL 只会从这个文件中读取配置项,需要注意,defaults-file 在所有命令行参数中必须排在最前面才有效。
注3:如果有多个配置文件,查看当前生效的配置及使用配置文件位置的SQL语句
SELECT |
---|
my.cnf(my.ini)文件是一个文本文件,每个配置项都包含在一个特定的节(section)中,每个节由方括号 [ ] 包围,表示该节下的配置项适用于哪个组件或服务。常见的节包括:
[mysqld]: 针对 MySQL 服务器的配置
[client]: 针对所有客户端程序的配置
[mysql]: 针对 mysql 命令行工具的配置
这是 MySQL 服务器的主要配置部分。
配置名称 | 配置说明 |
---|---|
basedir=/smartbi/mysql_8 | MySQL的安装目录 |
datadir=/smartbi/mysql_8/data | MySQL的数据存储目录 |
socket=/smartbi/mysql_8/mysql.sock | 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件 |
port=6688 | 设置TCP/IP通信端口 |
character-set-server=utf8mb4 | 设置默认的字符集 |
collation-server=utf8mb4_unicode_ci | 设置排序规则 |
配置名称 | 配置说明 |
---|---|
innodb_buffer_pool_size = 1G | 缓冲池的大小(以字节为单位),即InnoDB缓存表和索引数据的内存区域。默认值为(128MB) |
interactive_timeout = 1800 | 交互超时时间,默认8小时 |
wait_timeout = 1800 | 等待超时时间,默认8小时 |
skip_name_resolve = 1 | 跳过反向解析过程 |
lower_case_table_names=1 | 大小写是否敏感配置 |
max_connections = 1024 | 最大连接数配置 |
max_connect_errors = 100000 | 最大连接错误数 |
max_allowed_packet=512M | 客户端和服务器之间可以传输的最大数据包大小 |
配置名称 | 配置说明 |
---|---|
slow_query_log=1 | 慢查询日志开关(1 开启,0 关闭),排查性能问题时开启,生产环境需要关闭 |
slow_query_log_file=/smartbi/mysql_8/data/mysql-slow.log | 慢查询日志文件路径 |
long_query_time=10 | 记录慢查询的时间阈值(秒),当前配置为10s |
配置名称 | 配置说明 |
---|---|
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | SQL 模式,定义 MySQL 应如何处理数据校验和错误处理 |
bind_address=10.4.7.79 | 绑定允许访问的IP白名单 |
配置名称 | 配置说明 |
---|---|
server-id= | 设置了服务器 ID,用于主从复制 |
log_bin | 启用了二进制日志 |
binlog_format | 设置了二进制日志格式 |
expire_logs_days | 设置了二进制日志的过期天数 |
max_binlog_size | 设置了单个二进制日志文件的最大大小 |
这是客户端程序的配置部分,主要是为了给mysql 客户端命令配置相关参数,此处配置了,在命令行中就不需要再次指定了
配置名称 | 配置说明 |
---|---|
user=root | 客户端登录的用户名 |
port=3306 | 客户端连接的端口 |
socket=/smartbi/mysql_8/mysql.sock | 客户端连接的套接字文件路径(此处配置了,链接时就不会找默认的/tmp/mysql.sock) |
default-character-set=utf8mb4 | 客户端默认字符集,推荐utf8mb4 |
如下截图所示,因为在client中配置了user,链接时直接指定-p 输入密码即可,不用再执行-uroot参数了。
另执行[\s]命令可以看到当前的连接信息情况。
这是 MySQL 命令行工具的配置部分的配置,很少使用到,了解一下即可,基本不用配置。
公司内部使用的MySQL知识库的参数配置的基线也是基于my.cnf的调优配置(基本的调优配置如下),详情参考下方链接说明。
innodb_buffer_pool_size = 1G interactive_timeout = 1800 wait_timeout = 1800 skip_name_resolve = 1 lower_case_table_names=1 max_connections = 1024 max_connect_errors = 100000 max_allowed_packet=512M |
---|