麒麟开发日志
麒麟开发日志
前期环境配置
sysbench安装过程中遇到的问题、解决办法;
如何利用sysbench对mySQL进行压力测试:
参见对话24/6/13 Kylin
docker的安装和配置
solution在最后一步。
1.按照gpt给出的提示尝试安装依赖
sudo dnf -y install dnf-plugins-core
但是麒麟没有这个包
2.尝试改用Fedora系统的安装步骤,
sudo dnf -y install dnf-plugins-core
系统已经有这个包,看来走的方向对了
3.设置稳定版的 Docker 仓库
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
4.安装 Docker:
sudo dnf install docker-ce docker-ce-cli containerd.io
结果遇到了报错
[xjbo@TestKylin ~]$ sudo dnf install docker-ce docker-ce-cli containerd.io Docker CE Stable - x86_64 192 B/s | 384 B 00:02 Errors during downloading metadata for repository 'docker-ce-stable': - Status code: 404 for https://download.docker.com/linux/fedora/10/x86_64/stable/repodata/repomd.xml (IP: 128.121.243.77) Error: Failed to download metadata for repo 'docker-ce-stable': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
于是尝试将/etc/yum.repos.d/docker-ce.repo当中的所有fedora都换成centos/7,但依然重复了相同的报错
5.尝试用官方的自动安装脚本进行安装,结果不支持kylin
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
遇到报错:
[xjbo@TestKylin Download]$ sudo sh ./get-docker.sh # Executing docker install script, commit: 1ce4e39c9502b89728cdd4790a8c3895709e358d ERROR: Unsupported distribution 'kylin'
6.于是去官网手动下载rpm包,下载链接:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载了以下包:
containerd.io-1.2.0-3.el7.x86_64.rpm
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
docker-ce-cli-18.09.0-3.el7.x86_64.rpm
(ce是community release,el7: 表示该 RPM 包是为 CentOS 7 或 RHEL 7 编译的)
然后又遇到了依赖问题:
[xjbo@TestKylin Download]$ sudo rpm -ivh docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm 警告:docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 621e9f35: NOKEY 错误:依赖检测失败: docker-ce-selinux >= 17.03.0.ce-1.el7.centos 被 docker-ce-17.03.0.ce-1.el7.centos.x86_64 需要
于是继续安装它需要的依赖
7.wget获取包
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
然后安装这个包的时候,又出现了依赖问题()
[xjbo@TestKylin Download]$ sudo rpm -ivh docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm 警告:docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 621e9f35: NOKEY 错误:依赖检测失败: policycoreutils-python 被 docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch 需要
但是麒麟也没有提供这个包,于是再去wget下载
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/policycoreutils-python-2.5-34.el7.x86_64.rpm
但是接下来遇到了海量的依赖问题,dnf命令也找不到相关的依赖。。。。
这条路似乎走不通。。。。
8.找到一个参考博客
但这里给出的大体步骤与之前类似,而且最后还是遇到了从docker库获取元数据失败的报错
9.然后找到了stackoverflow的一篇帖子
按照最高赞回帖的步骤,执行了一下sed文本替换,但是依然元数据获取失败。
10.试图为麒麟安装epel-release支持,但是因为安装不了依赖项redhat-release最终失败
11.尝试手动安装所有依赖,需要的依赖:
nothing provides libapol.so.4()(64bit) needed by policycoreutils-python-2.5-34.el7.x86_64 nothing provides libapol.so.4(VERS_4.0)(64bit) needed by policycoreutils-python-2.5-34.el7.x86_64 nothing provides libqpol.so.1()(64bit) needed by policycoreutils-python-2.5-34.el7.x86_64 nothing provides libqpol.so.1(VERS_1.2)(64bit) needed by policycoreutils-python-2.5-34.el7.x86_64 nothing provides libqpol.so.1(VERS_1.4)(64bit) needed by policycoreutils-python-2.5-34.el7.x86_64 nothing provides policycoreutils = 2.5-34.el7 needed by policycoreutils-python-2.5-34.el7.x86_64 nothing provides setools-libs >= 3.3.8-4 needed by policycoreutils-python-2.5-34.el7.x86_64
wget安装这些包:
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/setools-libs-3.3.8-4.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/policycoreutils-2.5-34.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/policycoreutils-python-2.5-34.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/libapol-3.3.8-4.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/libqpol-3.3.8-4.el7.x86_64.rpm
但是全部都404了
12.solution
最后询问了麒麟的老师,原来通过docker-ce,docker-ce-cli,container-io的安装方式安装的是新版docker,而旧版docker只需要一个docker-engine即可;
而麒麟的软件源本身是含有这个docker-engine包的。
因此直接用dnf命令安装即可。
MYsql配置
sudo mysqld_safe --skip-grant-tables & mysql -u root
cd /usr/local/mysql/bin/
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mysql123456';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysql123456';
[xjbo@TestKylin bin]$ sudo sysbench --db-driver=mysql --mysql-db=sbtest --mysql-user=root --mysql-password=mysql123456 --table-size=1000000 --tables=10 /usr/share/sysbench/oltp_read_write.lua prepare
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
sysbench --db-driver=mysql --mysql-db=sbtest --mysql-user=your_username --mysql-password=your_password --tables=10 /usr/share/sysbench/oltp_read_write.lua cleanup
mysql community库的添加
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
安装这个.rpm包之后,就能够将
mysql-connectors-community MySQL Connectors Community
mysql-tools-community MySQL Tools Community
mysql80-community MySQL 8.0 Community Server
添加到系统的repolist当中
数据收集脚本
在data_sample.py当中,一开始出现了这样的情况:
def get_pid_sum(dicts, pid_list): res = create_default(dicts) for name, data in dicts.items(): for k, v in data.items(): pid = str(k.value) if pid in pid_list: val = v.value res[name] = val return res def get_proc_sum(dicts): pid_dict = defaultdict(lambda: create_default(dicts)) for name, data in dicts.items(): for k, v in data.items(): pid = str(k.value) val = v.value pid_dict[pid][name] = val return pid_dict
利用get_pid_sum单独测量mysql进程的数据,发现结果都是零;但是用get_proc_sum测量所有进程的总数据,又是有输出的:
这说明eBPF程序和采集数据本身肯定是正确的;
最后发现错误出在一个很细节的地方:我传入的pid_list是一个int的list,而这里
pid = str(k.value)
用的却是str,所以无论哪个进程,这个if判断的结果都为假;
只要把这里改为int即可。
mysql重装/修改配置文件
mysql修改配置文件之后,
systemctl restart mysql无法正常重启mysql
解决方案:
之前的mysql进程没有清理干净,把所有和mysql相关的进程都清理掉,然后重启即可。
离线调优
系统不支持sysctl某参数
在mysql-sysbench调优过程中,发现该系统不支持sysctl的某个参数,但是让用户手动删除太麻烦,解决方案:
在optimizer.go的CheckServerPrj函数中,添加配置项检查功能,检查当前系统是否支持这个配置项,若否则直接跳过这一项(尚未实验求证效果)
go_gc
能够直接运行
memory
能够直接运行
mysql-sysbench
在调优过程中,get_eval中这段代码可能会产生问题(这是已经修改后的版本)
if [ -f "PATH/sysbench_oltp_read_write.log" ]; then QPS=$(grep 'queries:' PATH/sysbench_oltp_read_write.log | awk -F '(' '{print $2}' | awk -F ' ' '{print $1}') # Check if QPS is a valid number if [[ ! -z "$QPS" ]] && [[ "$QPS" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "$QPS" exit 0 fi fi
GPT给出的解释和相应的解决办法:
你的 get_eval.sh
脚本的逻辑是等待一个文件出现,并在文件中找出包含 queries:
的行,然后提取括号内的第一个数值。这个值应该是 QPS。然而,脚本有可能在文件未生成前就结束循环,导致返回空值。
为了确保脚本在文件生成并获取到正确的 QPS 值之前不会退出,可以做以下改进:
- 增加最大等待时间。
- 确保输出是一个有效的浮点数。
- 增加一些调试信息以便更容易排查问题。
按照这些建议修改后,得到最终版本
并发数过多导致的死锁问题
经过多次控制变量的实验之后,发现可能是.py文件执行命令和.sh文件执行命令逻辑不同导致的:
通过.py文件发起sysbench压测mysql,无论线程数开到多少都没有问题;但是.sh文件一旦线程数稍大,就会出现死锁的情况,具体原因尚不清楚,目前只能对症下药:
减少并发数
测试时一般采用一到两个
修改my.cnf后,情况似乎有所改善,但没有测试高并发的情况
丰富功能
增加undo脚本,可以把文件内容和脚本所做的改动还原,方便用户重置操作,或在多个机器间灵活转移
突发状况
在没有对系统和代码做任何改动的情况下,突然出现了错误:
modprobe: FATAL: Module kheaders not found in directory /lib/modules/4.19.90-89.11.v2401.ky10.x86_64 Unable to find kernel headers. Try rebuilding kernel with CONFIG_IKHEADERS=m (module) or installing the kernel development package for your running kernel version. <built-in>:1:10: fatal error: './include/linux/kconfig.h' file not found #include "./include/linux/kconfig.h" ^~~~~~~~~~~~~~~~~~~~~~~~~~~
原因是我安装的kernel-devel包是.14的,但是当前运行的内核版本是.11,注意在系统GRUB界面选的内核版本要和这个包相对应
编译pcm
需要先安装包libasan 和 libasan-static
a-tune启动失败的常见原因
类似于collector,a-tune经常因为采集的硬件选错导致报错,在启动前要注意检查,尤其是network设备,因为它经常变动
在ip addr的输出当中,state显示为DOWN的设备就是为启用,要选择UP状态的.