RISC-V平台上的Zoopeeker
调研信息
关于Zookeeper
Zookeeper 是一个分布式协调服务,专注于配置管理、同步和故障恢复,侧重于分布式系统的协调和管理,提供配置管理、同步和 leader 选举等功能,Zookeeper 被广泛应用于各种分布式系统中,主要是管理数据组件集群的元数据,如
- 用于管理 Hadoop 集群的元数据
- 用于管理 Kafka 集群的元数据和协调消费者
- 用于管理 HBase 集群的配置和协调任务。
关于benchmark
Benchmark就是基准测试,是一种用于测量和评估系统性能的标准化测试方法。通过执行一系列标准化的任务和工作负载,Benchmark 通过标准化测试,可以比较不同系统或不同版本的性能,帮助用户选择最合适的解决方案,还能以帮助识别系统中的性能瓶颈,找出影响系统效率的关键因素,从而进行有针对性的优化。总之,它能够用于比较不同系统或配置的性能,发现系统瓶颈,并提供优化的依据。
Zoopeeker本身没有自带的测试脚本,这里我使用了文档中提供的zookeeper-benchmark来进行测试,除此之外我还调研到还有YCSB的Zoopeeker测试模块,时间充裕的情况可以尝试。
环境搭建
配置Zoopeeker
首先需要为你文件配置环境变量,通过~/.ssh/bashrc
,追加这段内容:
export ZOOKEEPER_HOME=/home/bigdata2/zhoufm/zookeeper-3.4.6
然后使用source ~/.ssh/bashrc
更新一下,最后echo $ZOOKEEPER_HOME
一下就能检验你是否成功了。
然后是$ZOOKEEPER_HOME/conf/
下的zoo_sample.cfg
需要修改文件名为zoo.cfg
,因为没有其他节点是本地端口连接,基本不用怎么修改里面的内容,说明文档里还要改dataDir来指定数据的位置.
如果需要增加链接的节点,需要追加节点编号和主机名及端口如·server.1=host1:2888:3888
。可以运行bin/zkServer.sh start
来查看是否能成功启动 Zookeeper。
配置zookeeper-benchmark
具体细节可以参考工具得readme,写的也很清楚,我这里基于我的情况给大家一个实例。 如果需要编译,需要使用maven来运行:
mvn -DZooKeeperVersion=3.4.6 package
然后修改benchmark.conf,追加单机测试的节点
server.1=localhost:2181
然后配置文件的其他的参数只与运行设置有关,可以根据需要修改。 到这里Zookeeper的环境配置基本完成。
测试工作
zookeeper-benchmark里面提供了运行脚本runBenchmark.sh
可以来根据配置文件benchmark.conf
来进行测试,它需要两个参数 第一个是运行结果文件名 第二个是指定配置文件。不可以通过命令行配置参数,只能通过配置文件。
./runBenchmark.sh my_run benchmark.conf
脚本基准测试的内容包含五项功能基准测试包括节点读取,相同节点写入,节点创建,不同节点写入和节点删除,和对应有着各自的操作速度和延迟数据。 消息队列的实际场景通常复杂多变,需要来尝试不同参数下不一样的conf,根据典型场景的需要分别配置配置文件的不同参数来进行模拟测试和记录测试结果,参数包括间隔、总操作数、阈值、持续时间、同步方式。
还能使用performance_counter_920.sh
对这条命令进行额外的性能参数测试,这个脚本需要两个参数 第一个完整的测试脚本运行命令 第二个参数结果存储地址,参数使用引号标注,运行:
performance_counter_920.sh "/home/bigdata2/zhoufm/zookeeper-benchmark/runBenchmark.sh my_run benchmark.conf" "./"
这样可以得到这个脚本运行额外的性能测试信息。
半自动化脚本
对于流处理与消息队列来说,不同的实际场景的参数变化有较为大的影响,需要实现多种参数的不同配置然后一条一条的运行命令行是很低效的事情,所以构建自动化脚本是很重要的。对于本次工作,完成了对zookeeper-benchmark工具的自动化脚本,实现一条命令构建多个不同参数测试执行的效果,大大提高测试的效率。 具体编写了三个小脚本:wrapper.sh是包装原本的测试脚本可以通过命令行调参数,auto_run.sh是通过配置txt文件来连续调用wrapper.sh,parse_logs.sh是读取测试脚本生成的日志把提取信息到处成txt。这些脚本与runBenchmark.sh在同一路径下。 脚本实现流程大致如下:
- zookeeper-benchmark不支持参数作为命令行输入,只能通过benchmark.conf文件配置,编写包装脚本wrapper.sh来对原本的命令行的一系列参数进行配置输入。
- 然后编写auto_run.sh和params.txt来进行多个不同参数的测试用例进行执行,只需要在params.txt编写好典型场景可能得参数配置,就可以通过auto_run.sh来一行行读取并运行包装脚本执行。
- 最后编写一个自动化脚本parse_logs.sh来读取每个 run_* 目录下的 zk-benchmark.log 文件,并提取其中的主要参数信息。以下是一个示例脚本 parse_logs.sh,它会遍历所有 run_* 目录,读取 zk-benchmark.log 文件并提取相关信息,最后输出到当前路径下的 summary.txt 文件中。
脚本的具体内容如下,vim 文件完整名称
后将脚本内容写入保存退出,使用chmod +x 文件完整名称
使新建的脚本具有可执行权限,
#wrapper.sh
RUN_NAME=$1
CONFIG_FILE="temp_benchmark.conf"
echo "# Generated configuration file for ZooKeeper benchmark" > $CONFIG_FILE
echo "totalTime=$2" >> $CONFIG_FILE
echo "interval=$3" >> $CONFIG_FILE
echo "totalOperations=$4" >> $CONFIG_FILE
echo "lowerbound=$5" >> $CONFIG_FILE
echo "sync=$6" >> $CONFIG_FILE
echo "server.1=$7" >> $CONFIG_FILE
./runBenchmark.sh $RUN_NAME $CONFIG_FILE --gnuplot
# Optionally, remove the temporary configuration file after running
rm $CONFIG_FILE
###
#auto_run.sh
# params.txt
# my_run1 30000 200 20000 8000 false localhost:2181
PARAMS_FILE="params.txt"
while IFS= read -r line
do
# Skip empty lines and lines starting with #
if [[ -z "$line" || "$line" == \#* ]]; then
continue
fi
# Run wrapper.sh with parameters from the line
./wrapper.sh $line
# Optionally, you can add a delay between runs
# sleep 10
done < "$PARAMS_FILE"
#parse_logs.sh
OUTPUT_FILE="summary.txt"
> $OUTPUT_FILE # 清空输出文件
for dir in run_*
do
if [[ -d $dir && -f $dir/zk-benchmark.log ]]; then
LOG_FILE="$dir/zk-benchmark.log"
echo "Processing $LOG_FILE" >> $OUTPUT_FILE
INTERVAL=$(grep "benchmark set with" $LOG_FILE | awk -F'interval: ' '{print $2}' | awk '{print $1}')
TOTAL_NUMBER=$(grep "benchmark set with" $LOG_FILE | awk -F'total number: ' '{print $2}' | awk '{print $1}')
THRESHOLD=$(grep "benchmark set with" $LOG_FILE | awk -F'threshold: ' '{print $2}' | awk '{print $1}')
TIME=$(grep "benchmark set with" $LOG_FILE | awk -F'time: ' '{print $2}' | awk '{print $1}')
SYNC=$(grep "benchmark set with" $LOG_FILE | awk -F'sync: ' '{print $2}' | awk '{print $1}')
echo "Interval: $INTERVAL" >> $OUTPUT_FILE
echo "Total Number: $TOTAL_NUMBER" >> $OUTPUT_FILE
echo "Threshold: $THRESHOLD" >> $OUTPUT_FILE
echo "Time: $TIME" >> $OUTPUT_FILE
echo "Sync: $SYNC" >> $OUTPUT_FILE
while read -r line; do
if [[ $line == *"INFO zkbenchmark.ZooKeeperBenchmark:"* ]]; then
case $line in
*"READ finished"*)
OPERATION="READ"
;;
*"SETSINGLE finished"*)
OPERATION="SETSINGLE"
;;
*"CREATE finished"*)
OPERATION="CREATE"
;;
*"SETMULTI finished"*)
OPERATION="SETMULTI"
;;
*"DELETE finished"*)
OPERATION="DELETE"
;;
*)
continue
;;
esac
TIME_ELAPSED=$(echo $line | awk -F'time elapsed (sec): ' '{print $2}' | awk '{print $1}')
OPERATIONS=$(echo $line | awk -F'operations: ' '{print $2}' | awk '{print $1}')
AVG_RATE=$(echo $line | awk -F'avg rate: ' '{print $2}')
echo "$OPERATION - Time Elapsed: $TIME_ELAPSED sec, Operations: $OPERATIONS, Avg Rate: $AVG_RATE" >> $OUTPUT_FILE
fi
done < $LOG_FILE
echo "" >> $OUTPUT_FILE
fi
done
echo "Summary written to $OUTPUT_FILE"
Q&A
我作为不熟悉命令行界面的新手遇到最难的问题就是糟糕配置环境和连接服务器,因为研究这个这两个和测试没有太大关系的事情花费了大量时间和精力精疲力竭了,导致花在工具使用,脚本实现的实际测试中的时间只占很少一部分,没有很深入地探索消息队列测试的复杂性,进一步扩展可用的benchmark工具和编写更好用的自动化脚本,这成为了一种遗憾,非常可惜。但是总归是在这些杂七杂八的问题有了很大收获,希望这里的一些解答能帮到你。
不懂命令行操作怎么办
其实刚开始使用不会,不熟练是正常的,肯去搜索和多用就会很快熟练起来。而且常用的命令基本上就是cd mkdir cp mv pwd vim wq这些基础的。
服务器连接总是失败
我个人经验是很有可能你链接的配置信息写错了或者是本地存储的信息出错了需要清空缓存重新配置,最好根据报错信息去研究一下。如果发现自己确实没法解决,赶快截屏报错信息去群里找大佬求助,大家还是很乐于助人的。(我不小心把改错了系统级的环境变量,直接干得其他人用不了命令行,也就被友好指正,都没有被骂,大家真的是亚撒西呀!
依赖库缺失或版本不匹配问题
出现报错:/opt/tools/installed/jdk8u191-b12/bin/java: cannot execute binary file: Exec format error。错误提示表明系统在尝试执行Java 二进制文件时遇到了问题。错误信息 “Exec format error” 通常意味着二进制文件与当前系统架构不兼容。我分析一下可能的原因和解决方案:
- 架构不匹配:您的系统是 RISC-V 64位架构(openeuler-riscv64),但脚本尝试运行的 Java 二进制文件(/opt/tools/installed/jdk8u191-b12/bin/java)可能为其他架构(如 x86_64 或 ARM)编译的。
- 环境变量问题:脚本似乎使用一个特定路径的Java版本(/opt/tools/installed/jdk8u191-b12/bin/java),而不是您之前显示的OpenJDK版本。
- 权限问题:不可能,但也要检查员执行权限
解决方案:优先检查JAVA_HOME路径是否正确,使用echo $JAVA_HOME环境变量,但是依然没有效果,应该是当前的Java是ARM架构下的编译的版本,尝试安装一个RISC-V 64位架构的jdk。
性能变形严重问题
在脚本输出的结果中,接连后面的结果又显著升高,在连续执行的在高负载测试下,Zookeeper的消息吞吐量显著低于预期,而且延迟增加Zookeeper的请求响应时间较长,尤其是在并发异步请求数量较多的情况下。且只要是第一个的测试就能正常执行,如果多个测试就会出现异常值。 可能是Zookeeper成为节点设置的资源不足,生产者配置可能未针对高吞吐量进行优化,消费者未能跟上生产速度或者Topic地区数量可能限制了它处理能力. 解决方案:通过对Zookeeper的性能进行实时监控和分析,及时发现性能瓶颈和异常情况,发现在第一次测试执行完毕后,没有删除占用的资源,导致下一次测试运行环境改变,结果不同,在脚本中每次执行完毕后结束任务再开启下一个测试。