sysbench 测试MySQL磁盘IOPS
1. 安装
https://github.com/akopytov/sysbench.git # 通过git clone得到源码
2. 上传到MySQL服务器并解压
[root@localhost soft]# unzip sysbench-master.zip [root@localhost soft]# mv sysbench-master sysbench [root@localhost sysbench]# ./autogen.sh autoreconf: Entering directory `.' autoreconf: configure.ac: not using Gettext autoreconf: running: aclocal -I m4 autoreconf: configure.ac: tracing autoreconf: running: libtoolize --copy libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config'. libtoolize: copying file `config/ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. libtoolize: copying file `m4/libtool.m4' libtoolize: copying file `m4/ltoptions.m4' libtoolize: copying file `m4/ltsugar.m4' libtoolize: copying file `m4/ltversion.m4' libtoolize: copying file `m4/lt~obsolete.m4' autoreconf: running: /usr/bin/autoconf autoreconf: running: /usr/bin/autoheader autoreconf: running: automake --add-missing --copy --no-force configure.ac:59: installing 'config/ar-lib' configure.ac:45: installing 'config/compile' configure.ac:27: installing 'config/config.guess' configure.ac:27: installing 'config/config.sub' configure.ac:32: installing 'config/install-sh' configure.ac:32: installing 'config/missing' src/Makefile.am: installing 'config/depcomp' parallel-tests: installing 'config/test-driver' autoreconf: Leaving directory `.'
2.1 关联mysql的头文件和库
[root@localhost sysbench]# ./configure --with-mysql-includes=/mysqlsoft/mysql/include/ --with-mysql-libs=/mysqlsoft/mysql/lib/ checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether make supports nested variables... yes checking for style of include used by make... GNU checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking dependency style of gcc... gcc3 checking how to run the C preprocessor... gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking minix/config.h usability... no checking minix/config.h presence... no checking for minix/config.h... no checking whether it is safe to define __EXTENSIONS__... yes checking for gcc... (cached) gcc checking whether we are using the GNU C compiler... (cached) yes checking whether gcc accepts -g... (cached) yes checking for gcc option to accept ISO C89... (cached) none needed checking dependency style of gcc... (cached) gcc3 checking for gcc option to accept ISO C99... -std=gnu99 checking how to run the C preprocessor... gcc -E checking whether gcc -std=gnu99 and cc understand -c and -o together... yes checking for a sed that does not truncate output... /usr/bin/sed checking for C compiler vendor... gnu checking for gcc architecture flag... checking for x86 cpuid 0 output... d:756e6547:6c65746e:49656e69 checking for x86 cpuid 1 output... 306e7:2040800:9e982203:1fabfbff checking whether C compiler accepts -march=ivybridge... no checking whether C compiler accepts -march=core-avx-i... yes checking for gcc architecture flag... -march=core-avx-i checking for ar... ar checking the archiver (ar) interface... ar checking how to print strings... printf checking for a sed that does not truncate output... (cached) /usr/bin/sed checking for fgrep... /usr/bin/grep -F checking for ld used by gcc -std=gnu99... /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... yes checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B checking the name lister (/usr/bin/nm -B) interface... BSD nm checking whether ln -s works... yes checking the maximum length of command line arguments... 1572864 checking whether the shell understands some XSI constructs... yes checking whether the shell understands "+="... yes checking how to convert x86_64-unknown-linux-gnu file names to x86_64-unknown-linux-gnu format... func_convert_file_noop checking how to convert x86_64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop checking for /usr/bin/ld option to reload object files... -r checking for objdump... objdump checking how to recognize dependent libraries... pass_all checking for dlltool... no checking how to associate runtime and link libraries... printf %s\n checking for archiver @FILE support... @ checking for strip... strip checking for ranlib... ranlib checking command to parse /usr/bin/nm -B output from gcc -std=gnu99 object... ok checking for sysroot... no checking for mt... mt checking if mt is a manifest tool... no checking for dlfcn.h... yes checking for objdir... .libs checking if gcc -std=gnu99 supports -fno-rtti -fno-exceptions... no checking for gcc -std=gnu99 option to produce PIC... -fPIC -DPIC checking if gcc -std=gnu99 PIC flag -fPIC -DPIC works... yes checking if gcc -std=gnu99 static flag -static works... no checking if gcc -std=gnu99 supports -c -o file.o... yes checking if gcc -std=gnu99 supports -c -o file.o... (cached) yes checking whether the gcc -std=gnu99 linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... yes checking for pkg-config... yes checking for C compiler vendor... (cached) gnu checking whether to compile with MySQL support... yes checking whether to compile with PostgreSQL support... no checking for pkg-config... /usr/bin/pkg-config checking pkg-config is at least version 0.9.0... yes checking whether to build with system or bundled LuaJIT... bundled checking whether to build with system or bundled Concurrency Kit... bundled checking whether SHM_HUGETLB is declared... yes checking whether O_SYNC is declared... yes checking for the pthreads library -lpthreads... no checking whether pthreads work without any flags... no checking whether pthreads work with -Kthread... no checking whether pthreads work with -kthread... no checking for the pthreads library -llthread... no checking whether pthreads work with -pthread... yes checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE checking if more special flags are required for pthreads... no checking for sqrt in -lm... yes checking MySQL includes... (cached) /mysqlsoft/mysql/include/ checking MySQL libraries... (cached) /mysqlsoft/mysql/lib/ checking for library containing mysql_real_connect... -lmysqlclient checking if mysql.h defines MYSQL_OPT_SSL_MODE... yes checking libaio.h usability... no checking libaio.h presence... no checking for libaio.h... no checking for ANSI C header files... (cached) yes checking errno.h usability... yes checking errno.h presence... yes checking for errno.h... yes checking fcntl.h usability... yes checking fcntl.h presence... yes checking for fcntl.h... yes checking math.h usability... yes checking math.h presence... yes checking for math.h... yes checking pthread.h usability... yes checking pthread.h presence... yes checking for pthread.h... yes checking sched.h usability... yes checking sched.h presence... yes checking for sched.h... yes checking signal.h usability... yes checking signal.h presence... yes checking for signal.h... yes checking for stdlib.h... (cached) yes checking for string.h... (cached) yes checking sys/aio.h usability... no checking sys/aio.h presence... no checking for sys/aio.h... no checking sys/ipc.h usability... yes checking sys/ipc.h presence... yes checking for sys/ipc.h... yes checking sys/time.h usability... yes checking sys/time.h presence... yes checking for sys/time.h... yes checking sys/mman.h usability... yes checking sys/mman.h presence... yes checking for sys/mman.h... yes checking sys/shm.h usability... yes checking sys/shm.h presence... yes checking for sys/shm.h... yes checking thread.h usability... no checking thread.h presence... no checking for thread.h... no checking for unistd.h... (cached) yes checking limits.h usability... yes checking limits.h presence... yes checking for limits.h... yes checking libgen.h usability... yes checking libgen.h presence... yes checking for libgen.h... yes checking for off_t... yes checking whether time.h and sys/time.h may both be included... yes checking for thread local storage (TLS) class... __thread checking for __attribute__((format))... yes checking for __attribute__((unused))... yes checking for special C compiler options needed for large files... no checking for _FILE_OFFSET_BITS value needed for large files... no checking size of size_t... 8 checking size of bool... 1 checking for stdlib.h... (cached) yes checking for unistd.h... (cached) yes checking for sys/param.h... yes checking for getpagesize... yes checking for working mmap... yes checking whether strerror_r is declared... yes checking for strerror_r... yes checking whether strerror_r returns char *... yes checking for library containing clock_gettime... none required checking for alarm... yes checking for clock_gettime... yes checking for directio... no checking for fdatasync... yes checking for gettimeofday... yes checking for isatty... yes checking for memalign... yes checking for memset... yes checking for posix_memalign... yes checking for pthread_cancel... yes checking for pthread_yield... yes checking for setvbuf... yes checking for sqrt... yes checking for strdup... yes checking for thr_setconcurrency... no checking for valloc... yes checking for pthread_once... yes checking that generated files are newer than configure... done configure: creating ./config.status config.status: creating Makefile config.status: creating third_party/luajit/Makefile config.status: creating third_party/concurrency_kit/Makefile config.status: creating src/Makefile config.status: creating src/drivers/Makefile config.status: creating src/drivers/mysql/Makefile config.status: creating src/drivers/pgsql/Makefile config.status: creating src/tests/Makefile config.status: creating src/tests/cpu/Makefile config.status: creating src/tests/fileio/Makefile config.status: creating src/tests/memory/Makefile config.status: creating src/tests/threads/Makefile config.status: creating src/tests/mutex/Makefile config.status: creating src/lua/Makefile config.status: creating src/lua/internal/Makefile config.status: creating tests/Makefile config.status: creating tests/include/config.sh config.status: creating snap/snapcraft.yaml config.status: creating config/config.h config.status: executing depfiles commands config.status: executing libtool commands =============================================================================== sysbench version : 1.1.0 CC : gcc -std=gnu99 CFLAGS : -O3 -funroll-loops -ggdb3 -march=core-avx-i -Wall -Wextra -Wpointer-arith -Wbad-function-cast -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wcast-align -Wvla -pthread CPPFLAGS : -D_GNU_SOURCE -I$(top_srcdir)/src -I$(abs_top_builddir)/third_party/luajit/inc -I$(abs_top_builddir)/third_party/concurrency_kit/include LDFLAGS : -L/usr/local/lib LIBS : -lm prefix : /usr/local bindir : ${prefix}/bin libexecdir : ${prefix}/libexec mandir : ${prefix}/share/man datadir : ${prefix}/share MySQL support : yes PostgreSQL support : no LuaJIT : bundled LUAJIT_CFLAGS : -I$(abs_top_builddir)/third_party/luajit/inc LUAJIT_LIBS : $(abs_top_builddir)/third_party/luajit/lib/libluajit-5.1.a -ldl LUAJIT_LDFLAGS : -rdynamic Concurrency Kit : bundled CK_CFLAGS : -I$(abs_top_builddir)/third_party/concurrency_kit/include CK_LIBS : $(abs_top_builddir)/third_party/concurrency_kit/lib/libck.a configure flags : ===============================================================================
2.2 编译源码
[root@localhost sysbench]# make -j 4
2.3 安装(默认安装到 /usr/local/bin , 如果有自定义目录,configure增加参数 –prefix=自定义目录)
[root@localhost sysbench]# make install
添加LD_LIBRARY_PATH
[root@localhost ~]# echo "export LD_LIBRARY_PATH=/mysqlsoft/mysql/lib/:$LD_LIBRARY_PATH" >> ~/.bashrc
[root@localhost ~]# source ~/.bashrc
[root@localhost ~]# sysbench –version
sysbench 1.1.0
3. 测试
生成测试文件
[root@localhost ~]# sysbench fileio help sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3) fileio options: --file-num=N number of files to create [128] --file-block-size=N block size to use in all IO operations [16384] --file-total-size=SIZE total size of files to create [2G] --file-test-mode=STRING test mode {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw} --file-io-mode=STRING file operations mode {sync,async,mmap} [sync] --file-extra-flags=[LIST,...] list of additional flags to use to open files {sync,dsync,direct} [] --file-fsync-freq=N do fsync() after this number of requests (0 - don't use fsync()) [100] --file-fsync-all[=on|off] do fsync() after each write operation [off] --file-fsync-end[=on|off] do fsync() at the end of test [on] --file-fsync-mode=STRING which method to use for synchronization {fsync, fdatasync} [fsync] --file-merged-requests=N merge at most this number of IO requests if possible (0 - don't merge) [0] --file-rw-ratio=N reads/writes ratio for combined test [1.5]
其他说明
# --file-num=N 创建文件数 # --file-block-size=N block size大小 # --file-total-size=SIZE 文件数的大小总和 # --file-test-mode=STRING 测试模式 {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw} (顺序写,顺序读写,顺序读,随机读,随机写,随机读写) # --file-io-mode=STRING 文件操作方式 {sync,async,mmap} # --file-extra-flags=STRING 打开文件的额外标志 {sync,dsync,direct} [] # --file-fsync-freq=N 多少请求后执行fsync。默认是0,不执行 # --file-fsync-all=[on|off] 是否每次操作后都执行fsync # --file-fsync-end=[on|off] 测完成后执行fsync,默认是on # --file-fsync-mode=STRING 同步的方法 {fsync, fdatasync}默认是 [fsync] # --file-merged-requests=N 最多多少IO请求被合并,默认为0,不合并 # --file-rw-ratio=N 读写比例默认是 [1.5],即 3:2
[root@localhost ~]# sysbench fileio --file-num=4 --file-block-size=8K --file-total-size=1G --file-test-mode=rndrd --file-extra-flags=direct prepare sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3) 4 files, 262144Kb each, 1024Mb total Creating files for the test... Extra file open flags: directio Creating file test_file.0 Creating file test_file.1 Creating file test_file.2 Creating file test_file.3 1073741824 bytes written in 29.00 seconds (35.30 MiB/sec).
开始测试(–time=30简单测试,测试30秒 –report-interval=3 # 每3秒产生报告)
[root@localhost ~]# sysbench fileio --file-num=4 --file-block-size=8K --file-total-size=1G --file-test-mode=rndrd --file-extra-flags=direct --threads=4 --time=30 --report-interval=3 run sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3) Running the test with following options: Number of threads: 4 Report intermediate results every 3 second(s) Initializing random number generator from current time Extra file open flags: directio 4 files, 256MiB each 1GiB total file size Block size 8KiB Number of IO requests: 0 Read/Write ratio for combined random IO test: 1.50 Periodic FSYNC enabled, calling fsync() each 100 requests. Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random read test Initializing worker threads... Threads started! [ 3s ] reads: 4.48 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 15.268 [ 6s ] reads: 4.39 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 15.828 [ 9s ] reads: 4.61 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 14.995 [ 12s ] reads: 4.73 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 13.953 [ 15s ] reads: 4.77 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 13.953 [ 18s ] reads: 4.81 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 14.207 [ 21s ] reads: 4.82 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 14.728 [ 24s ] reads: 4.84 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 14.995 [ 27s ] reads: 5.09 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 13.953 [ 30s ] reads: 5.16 MiB/s writes: 0.00 MiB/s fsyncs: 0.00/s latency (ms,95%): 14.207 Throughput: read: IOPS=610.59 4.77 MiB/s (5.00 MB/s) #4.77*1024/8; write: IOPS=0.00 0.00 MiB/s (0.00 MB/s) fsync: IOPS=0.00 Latency (ms): min: 0.18 avg: 6.54 max: 45.86 95th percentile: 14.46 sum: 119902.59