麒麟开发日志

麒麟开发日志

前期环境配置

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 值之前不会退出,可以做以下改进:

  1. 增加最大等待时间。
  2. 确保输出是一个有效的浮点数。
  3. 增加一些调试信息以便更容易排查问题。

按照这些建议修改后,得到最终版本

并发数过多导致的死锁问题

经过多次控制变量的实验之后,发现可能是.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

posted @ 2024-06-13 17:07  Gold_stein  阅读(25)  评论(0编辑  收藏  举报