Browse Source

H2O: Clean up the Dockerfile (#8009)

Profile-guided optimizations have been disabled for the time being
in order to simplify and to accelerate the build process.
Anton Kirilov 2 years ago
parent
commit
bee2f94e8b

+ 2 - 2
frameworks/C/h2o/README.md

@@ -19,8 +19,8 @@ the `initialize_*_handler*()` functions.
 If the test environment changes, it will probably be necessary to tune some of the framework
 settings in order to achieve the best performance possible. The most significant parameters are the
 maximum number of database connections per thread and the maximum number of pipelined database
-queries per database connection, which are controlled by the `DB_CONN` and the `DB_PIPELINE`
-variables respectively in the `h2o.sh` script.
+queries per database connection, which are controlled by the `-m` and the `-e` command-line
+options respectively.
 
 ## Performance issues
 

+ 79 - 37
frameworks/C/h2o/h2o.dockerfile

@@ -1,50 +1,92 @@
-FROM ubuntu:22.04
+ARG UBUNTU_VERSION=22.04
 
-WORKDIR /h2o_app_src
-COPY ./ ./
+ARG H2O_APP_PREFIX=/opt/h2o_app
+
+FROM "ubuntu:${UBUNTU_VERSION}" AS compile
 
 ARG DEBIAN_FRONTEND=noninteractive
 RUN apt-get -yqq update && \
-    apt-get -yqq install autoconf bison cmake curl file flex g++ git libnuma-dev libpq-dev \
-                         libssl-dev libtool libyajl-dev libz-dev make ninja-build wget
-
-### Install mustache-c
-
-ARG MUSTACHE_C_REVISION=c1948c599edfe48c6099ed70ab1d5911d8c3ddc8
+    apt-get -yqq install \
+      autoconf \
+      bison \
+      cmake \
+      curl \
+      flex \
+      g++ \
+      libnuma-dev \
+      libpq-dev \
+      libssl-dev \
+      libtool \
+      libuv1-dev \
+      libwslay-dev \
+      libyajl-dev \
+      libz-dev \
+      make \
+      ninja-build \
+      pkg-config
 
-ARG MUSTACHE_C_BUILD_DIR=mustache-c-build
-ENV MUSTACHE_C_PREFIX=/opt/mustache-c
-
-RUN mkdir -p "$MUSTACHE_C_BUILD_DIR" && \
-    cd "$MUSTACHE_C_BUILD_DIR" && \
-    wget -qO - "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISION}.tar.gz" | \
-    tar xz --strip-components=1 && \
-    CFLAGS="-O3 -flto -march=native -mtune=native" ./autogen.sh --prefix="$MUSTACHE_C_PREFIX" && \
-    make -j "$(nproc)" install && \
-    cd .. && \
-    rm -rf "$MUSTACHE_C_BUILD_DIR"
+ARG H2O_VERSION=v2.2.6
 
-### Install h2o
+WORKDIR /tmp/h2o-build
+RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \
+      tar --strip-components=1 -xz && \
+    cmake \
+      -B build \
+      -DCMAKE_AR=/usr/bin/gcc-ar \
+      -DCMAKE_C_FLAGS="-flto -march=native -mtune=native" \
+      -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \
+      -G Ninja \
+      -S . && \
+    cmake --build build -j && \
+    cmake --install build
 
-ARG H2O_VERSION=v2.2.6
+ARG MUSTACHE_C_REVISION=c1948c599edfe48c6099ed70ab1d5911d8c3ddc8
 
-ARG H2O_BUILD_DIR=h2o-build
-ENV H2O_PREFIX=/opt/h2o
+WORKDIR /tmp/mustache-c-build
+RUN curl -LSs "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISION}.tar.gz" | \
+      tar --strip-components=1 -xz && \
+    CFLAGS="-flto -march=native -mtune=native -O3" ./autogen.sh && \
+    make -j "$(nproc)" install
 
-RUN mkdir -p "${H2O_BUILD_DIR}/build" && \
-    cd "$H2O_BUILD_DIR" && \
-    wget -qO - "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \
-    tar xz --strip-components=1 && \
-    cd build && \
-    cmake -DCMAKE_INSTALL_PREFIX="$H2O_PREFIX" -DCMAKE_C_FLAGS="-flto -march=native -mtune=native" \
-          -DCMAKE_AR=/usr/bin/gcc-ar -DCMAKE_RANLIB=/usr/bin/gcc-ranlib -G Ninja .. && \
+ARG H2O_APP_PREFIX
+WORKDIR /tmp/build
+COPY CMakeLists.txt ../
+COPY src ../src/
+COPY template ../template/
+RUN cmake \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DCMAKE_C_FLAGS="-march=native -mtune=native" \
+      -DCMAKE_INSTALL_PREFIX="${H2O_APP_PREFIX}" \
+      -G Ninja \
+      -S .. && \
     cmake --build . -j && \
-    cmake --install . && \
-    cd ../.. && \
-    rm -rf "$H2O_BUILD_DIR"
+    cmake --install .
 
-ARG BENCHMARK_ENV
-ENV BENCHMARK_ENV=$BENCHMARK_ENV
+FROM "ubuntu:${UBUNTU_VERSION}"
+
+ARG DEBIAN_FRONTEND=noninteractive
+RUN apt-get -yqq update && \
+    apt-get -yqq install \
+      libnuma1 \
+      libpq5 \
+      libyajl2
+ARG H2O_APP_PREFIX
+COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/"
+COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/"
+ENV LD_LIBRARY_PATH="${H2O_APP_PREFIX}/lib"
 EXPOSE 8080
+ARG BENCHMARK_ENV
+ARG TFB_TEST_DATABASE
+ARG TFB_TEST_NAME
 
-CMD ["./h2o.sh"]
+CMD ["taskset", \
+     "-c", \
+     "0", \
+     "/opt/h2o_app/bin/h2o_app", \
+     "-a20", \
+     "-d", \
+     "dbname=hello_world host=tfb-database password=benchmarkdbpass sslmode=disable user=benchmarkdbuser", \
+     "-e64", \
+     "-f", \
+     "/opt/h2o_app/share/h2o_app/template", \
+     "-m1"]

+ 0 - 88
frameworks/C/h2o/h2o.sh

@@ -1,88 +0,0 @@
-#!/bin/bash
-
-set -e
-
-H2O_APP_PROFILE_PORT=54321
-H2O_APP_PROFILE_URL="http://127.0.0.1:$H2O_APP_PROFILE_PORT"
-SCRIPT_PATH=$(realpath "$0")
-H2O_APP_SRC_ROOT=$(dirname "$SCRIPT_PATH")
-H2O_APP_BUILD_DIR="${H2O_APP_SRC_ROOT}/build"
-
-if [[ -z "$DBHOST" ]]; then
-	DBHOST=tfb-database
-fi
-
-if [[ -z "$H2O_APP_PREFIX" ]]; then
-	H2O_APP_PREFIX=/opt/h2o_app
-fi
-
-if [[ -z "$H2O_PREFIX" ]]; then
-	H2O_PREFIX=/usr
-fi
-
-if [[ -z "$MUSTACHE_C_PREFIX" ]]; then
-	MUSTACHE_C_PREFIX=/opt/mustache-c
-fi
-
-if [[ "$BENCHMARK_ENV" = "Azure" ]]; then
-	DB_CONN=1
-	DB_PIPELINE=64
-else
-	DB_CONN=1
-	DB_PIPELINE=64
-fi
-
-build_h2o_app()
-{
-	cmake -DCMAKE_INSTALL_PREFIX="$H2O_APP_PREFIX" -DCMAKE_BUILD_TYPE=Release \
-	      -DCMAKE_PREFIX_PATH="${H2O_PREFIX};${MUSTACHE_C_PREFIX}" \
-	      -DCMAKE_C_FLAGS="-march=native -mtune=native $1" -G Ninja \
-	      "$H2O_APP_SRC_ROOT"
-	cmake --build . --clean-first -j
-}
-
-run_curl()
-{
-	for ((i = 0; i < 10; i++)); do
-		curl "${H2O_APP_PROFILE_URL}/$1" > /dev/null 2>&1
-	done
-}
-
-run_h2o_app()
-{
-	LD_LIBRARY_PATH="${MUSTACHE_C_PREFIX}/lib:$LD_LIBRARY_PATH" \
-	taskset -c "$1" "$2/h2o_app" -a20 -e "$DB_PIPELINE" -f "$3/template" -m "$DB_CONN" "$4" "$5" \
-	        -d "host=$DBHOST dbname=hello_world user=benchmarkdbuser sslmode=disable \
-	            password=benchmarkdbpass" &
-}
-
-generate_profile_data()
-{
-	run_h2o_app 0 . "$H2O_APP_SRC_ROOT" "-p$H2O_APP_PROFILE_PORT" -t1
-	local -r H2O_APP_PROFILE_PID=$!
-	while ! curl "$H2O_APP_PROFILE_URL" > /dev/null 2>&1; do sleep 1; done
-	run_curl json
-	run_curl db
-	run_curl queries?queries=20
-	run_curl fortunes
-	run_curl updates?queries=20
-	run_curl plaintext
-	run_curl cached-worlds?queries=20
-	kill -s SIGTERM "$H2O_APP_PROFILE_PID"
-	wait "$H2O_APP_PROFILE_PID"
-}
-
-install -d "$H2O_APP_BUILD_DIR"
-pushd "$H2O_APP_BUILD_DIR"
-build_h2o_app "-fprofile-generate"
-generate_profile_data
-rm -f CMakeCache.txt
-build_h2o_app "-fprofile-use"
-cmake --install .
-popd
-rm -rf "$H2O_APP_BUILD_DIR"
-echo "Running h2o_app in the $BENCHMARK_ENV environment."
-echo "Maximum database connections per thread: $DB_CONN"
-echo "Maximum pipelined database queries per database connection: $DB_PIPELINE"
-run_h2o_app 0 "${H2O_APP_PREFIX}/bin" "${H2O_APP_PREFIX}/share/h2o_app"
-wait

+ 10 - 1
frameworks/C/h2o/src/main.c

@@ -29,6 +29,7 @@
 #include <sys/resource.h>
 #include <sys/signalfd.h>
 #include <sys/time.h>
+#include <sys/utsname.h>
 
 #include "database.h"
 #include "error.h"
@@ -139,7 +140,15 @@ static int initialize_global_data(const config_t *config, global_data_t *global_
 	global_data->global_thread_data = initialize_global_thread_data(config, global_data);
 
 	if (global_data->global_thread_data) {
-		printf("Number of processors: %zu\nMaximum cache line size: %zu\n",
+		struct utsname name = {.sysname = {'\0'}};
+
+		uname(&name);
+		printf("Operating system: %s %s %s\n"
+		       "Number of processors: %zu\n"
+		       "Maximum cache line size: %zu\n",
+		       name.sysname,
+		       name.release,
+		       name.version,
 		       h2o_numproc(),
 		       global_data->memory_alignment);
 		return 0;

+ 9 - 3
frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile

@@ -12,7 +12,11 @@ WORKDIR /tmp/h2o-build
 RUN apt-get -yqq update && \
     apt-get -yqq install \
       cmake \
-      ninja-build && \
+      libcap-dev \
+      libuv1-dev \
+      libwslay-dev \
+      ninja-build \
+      systemtap-sdt-dev && \
     curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \
       tar --strip-components=1 -xz && \
     cmake \
@@ -29,12 +33,14 @@ RUN apt-get -yqq update && \
 
 FROM ruby:${RUBY_IMAGE_VERSION}-slim
 
+ARG DEBIAN_FRONTEND=noninteractive
+RUN apt-get -yqq update && apt-get -yqq install libcap2
 ARG H2O_PREFIX
 COPY --from=compile "${H2O_PREFIX}" "${H2O_PREFIX}/"
-COPY h2o.conf "${H2O_PREFIX}/"
+COPY h2o.conf "${H2O_PREFIX}/etc/"
 EXPOSE 8080
 ARG BENCHMARK_ENV
 ARG TFB_TEST_DATABASE
 ARG TFB_TEST_NAME
 
-CMD ["/opt/h2o/bin/h2o", "-c", "/opt/h2o/h2o.conf"]
+CMD ["/opt/h2o/bin/h2o", "-c", "/opt/h2o/etc/h2o.conf"]