diff --git a/.github/workflows/cargo_check.yml b/.github/workflows/cargo_check.yml index 24945b479..d05eb6a07 100644 --- a/.github/workflows/cargo_check.yml +++ b/.github/workflows/cargo_check.yml @@ -10,9 +10,9 @@ jobs: test: runs-on: ubuntu-latest timeout-minutes: 10 - container: jinuxdev/jinux:0.2.1 + container: jinuxdev/jinux:0.2.2 steps: - - run: echo "Running in jinuxdev/jinux:0.2.1" + - run: echo "Running in jinuxdev/jinux:0.2.2" - uses: actions/checkout@v3 diff --git a/.github/workflows/integration_test.yml b/.github/workflows/integration_test.yml index 8d9ff57ca..313f1d642 100644 --- a/.github/workflows/integration_test.yml +++ b/.github/workflows/integration_test.yml @@ -10,9 +10,9 @@ jobs: test: runs-on: ubuntu-latest timeout-minutes: 30 - container: jinuxdev/jinux:0.2.1 + container: jinuxdev/jinux:0.2.2 steps: - - run: echo "Running in jinuxdev/jinux:0.2.1" + - run: echo "Running in jinuxdev/jinux:0.2.2" - uses: actions/checkout@v3 diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml index e09a14ace..a9b4dc572 100644 --- a/.github/workflows/unit_test.yml +++ b/.github/workflows/unit_test.yml @@ -10,9 +10,9 @@ jobs: test: runs-on: ubuntu-latest timeout-minutes: 15 - container: jinuxdev/jinux:0.2.1 + container: jinuxdev/jinux:0.2.2 steps: - - run: echo "Running in jinuxdev/jinux:0.2.1" + - run: echo "Running in jinuxdev/jinux:0.2.2" - uses: actions/checkout@v3 diff --git a/Cargo.lock b/Cargo.lock index 2df8b5563..67e48cc9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -605,7 +605,7 @@ dependencies = [ [[package]] name = "jinux" -version = "0.2.1" +version = "0.2.2" dependencies = [ "component", "jinux-frame", diff --git a/Cargo.toml b/Cargo.toml index 04742b0e8..5d86a8379 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jinux" -version = "0.2.1" +version = "0.2.2" edition = "2021" [[bin]] diff --git a/Makefile b/Makefile index 062aec034..c4e5f2cbd 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ SKIP_GRUB_MENU ?= 1 RELEASE_MODE ?= 0 # End of setting up Make varaiables -KERNEL_CMDLINE := SHELL="/bin/sh" LOGNAME="root" HOME="/" USER="root" PATH="/bin" init=/usr/bin/busybox +KERNEL_CMDLINE := SHELL="/bin/sh" LOGNAME="root" HOME="/" USER="root" PATH="/bin:/benchmark" init=/usr/bin/busybox KERNEL_CMDLINE += ktest.whitelist="$(KTEST_WHITELIST)" INIT_CMDLINE := sh -l ifeq ($(AUTO_TEST), syscall) diff --git a/README.md b/README.md index 5113845b0..1128e92a5 100644 --- a/README.md +++ b/README.md @@ -34,12 +34,12 @@ git clone [repository url] 2. After downloading the source code, run the following command to pull the development image. ```bash -docker pull jinuxdev/jinux:0.2.1 +docker pull jinuxdev/jinux:0.2.2 ``` 3. Start the development container. ```bash -docker run -it --privileged --network=host --device=/dev/kvm -v `pwd`:/root/jinux jinuxdev/jinux:0.2.1 +docker run -it --privileged --network=host --device=/dev/kvm -v `pwd`:/root/jinux jinuxdev/jinux:0.2.2 ``` **All build and test commands should be run inside the development container.** diff --git a/VERSION b/VERSION index 0c62199f1..ee1372d33 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.1 +0.2.2 diff --git a/regression/Makefile b/regression/Makefile index 745c9e5a0..87da25cd1 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -18,6 +18,7 @@ INITRAMFS_ALL_DIRS := \ $(INITRAMFS)/bin \ $(INITRAMFS)/usr/bin \ $(INITRAMFS)/regression \ + $(INITRAMFS)/benchmark \ $(INITRAMFS_EMPTY_DIRS) .PHONY: all clean @@ -31,6 +32,12 @@ $(INITRAMFS)/lib/x86_64-linux-gnu: @cp -L /lib/x86_64-linux-gnu/libm.so.6 $@ @cp -L /lib/x86_64-linux-gnu/libgcc_s.so.1 $@ @cp -L /lib/x86_64-linux-gnu/libpthread.so.0 $@ + @# required for benchmarks + @cp -L /lib/x86_64-linux-gnu/libcrypto.so.3 $@ + @cp -L /lib/x86_64-linux-gnu/libcrypt.so.1 $@ + @cp -L /lib/x86_64-linux-gnu/libdl.so.2 $@ + @cp -L /lib/x86_64-linux-gnu/libz.so.1 $@ + @cp -L /usr/local/benchmark/iperf/lib/libiperf.so.0 $@ @# TODO: use a custom compiled vdso.so file in the future. @git clone https://github.com/jinzhao-dev/linux_vdso.git @cd ./linux_vdso && git checkout 2a6d2db 2>/dev/null @@ -60,6 +67,12 @@ $(INITRAMFS)/usr/bin: $(INITRAMFS)/bin $(INITRAMFS)/regression: @make --no-print-directory -C apps +$(INITRAMFS)/benchmark: + @mkdir -p $@ + @cp /usr/local/benchmark/sysbench/bin/sysbench $@ + @cp /usr/local/benchmark/iperf/bin/iperf3 $@ + @cp /usr/local/benchmark/membench/membench $@ + # Make necessary directories. $(INITRAMFS_EMPTY_DIRS): @mkdir -p $@ diff --git a/regression/benchmark/README.md b/regression/benchmark/README.md new file mode 100644 index 000000000..808e69de8 --- /dev/null +++ b/regression/benchmark/README.md @@ -0,0 +1,57 @@ +# Introduction to benchmarks + +## Sysbench +Sysbench is a scriptable benchmark tool that evaluates system performance. It includes five kinds of tests: CPU, memory, file I/O, mutex performance, and thread performance. Detailed usage and options can be found by using: +```shell +sysbench --help +sysbench --test= help +``` +Here we list some general commands for evaluation: +```shell +# CPU test +sysbench --test=cpu --cpu-max-prime= --num-threads= run + +# Thread test +sysbench --test=threads --thread-yields= --num-threads= --max-time= run + +# Mutex test +sysbench --test=mutex --mutex-num= --mutex-locks= --num-threads= + +# File test, the file-total-size and file-num of prepare and run must be consistent +sysbench --test=fileio --file-total-size= --file-num= prepare +sysbench --test=fileio --file-total-size= --file-num= --file-test-mode= --file-block-size= --max-time= run + +# Memory test +sysbench --test=memory --memory-block-size= --memory-access-mode= --memory-oper= run +``` + +## Membench +Membench is used to establish a baseline for memory bandwidth and latency. For specific usage and options, use: +```shell +membench --help +``` +Here we list some general commands to use membench: +```shell +# Measure the latency of mmap +membench -runtime=5 -dir=/dev/zero -size= -engine=mmap_lat + +# Measure the latency of page fault handling. The size must be consistent with the file size. +membench -runtime=5 -dir=path_to_a_file -size= -copysize= -mode= -engine=page_fault + +# This is a easy way to generate a file with target size in Linux. +# The following command can create a file named 512K.file with the size 512K. +dd if=/dev/zero of=512K.file bs=1K count=512 +``` + +## Iperf +iPerf is a tool for actively measuring the maximum achievable bandwidth on IP networks. Usage and options are detailed in: +```shell +iperf3 -h +``` +iperf can run in the following instructions: +```shell +export HOST_ADDR=127.0.0.1 +export HOST_PORT=8888 +iperf3 -s -B $HOST_ADDR -p $HOST_PORT -D # Start the server as a daemon +iperf3 -c $HOST_ADDR -p $HOST_PORT # Start the client +``` diff --git a/tools/docker/Dockerfile.ubuntu22.04 b/tools/docker/Dockerfile.ubuntu22.04 index 6a3b40ec6..39d7d4bb5 100644 --- a/tools/docker/Dockerfile.ubuntu22.04 +++ b/tools/docker/Dockerfile.ubuntu22.04 @@ -14,6 +14,44 @@ RUN apt update && apt-get install -y --no-install-recommends \ wget \ gnupg +#= Build benchmark ========================================================= +FROM build-base as build-benchmarks + +# Download the source files of benchmarks +WORKDIR /root +RUN apt install -y automake \ + libtool \ + pkg-config +RUN wget https://github.com/akopytov/sysbench/archive/1.0.20.tar.gz \ + && tar -zxvf 1.0.20.tar.gz \ + && rm 1.0.20.tar.gz +RUN git clone https://github.com/nicktehrany/membench.git +RUN git clone https://github.com/esnet/iperf.git + +# Build sysbench +WORKDIR /root/sysbench-1.0.20 +RUN ./autogen.sh \ + && ./configure --without-mysql --prefix=/usr/local/benchmark/sysbench \ + && make -j \ + && make install + +# Build membench +WORKDIR /root/membench +RUN make -j \ + && mkdir /usr/local/benchmark/membench \ + && cp membench /usr/local/benchmark/membench/ + +# Build iperf +WORKDIR /root/iperf +RUN ./configure --prefix=/usr/local/benchmark/iperf \ + && make -j \ + && make install + +WORKDIR /root +RUN rm -rf sysbench-1.0.20 \ + membench \ + iperf + #= Build syscall test ========================================================= FROM build-base as build-bazel @@ -208,6 +246,9 @@ RUN ln -sf /usr/share/grub/unicode.pf2 /usr/local/grub/share/grub/unicode.pf2 # Install Busybox built from the previous stages COPY --from=busybox /root/busybox/busybox /bin/busybox +# Install benchmarks built from the previous stages +COPY --from=build-benchmarks /usr/local/benchmark /usr/local/benchmark + # Add the path of jinux tools ENV PATH="/root/jinux/target/bin:${PATH}"