h2o.sh 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/bin/bash
  2. set -e
  3. CPU_COUNT=$(nproc)
  4. H2O_APP_PROFILE_PORT=54321
  5. H2O_APP_PROFILE_URL="http://127.0.0.1:$H2O_APP_PROFILE_PORT"
  6. SCRIPT_PATH=$(realpath "$0")
  7. H2O_APP_SRC_ROOT=$(dirname "$SCRIPT_PATH")
  8. H2O_APP_BUILD_DIR="${H2O_APP_SRC_ROOT}/build"
  9. if [[ -z "$DBHOST" ]]; then
  10. DBHOST=tfb-database
  11. fi
  12. if [[ -z "$H2O_APP_PREFIX" ]]; then
  13. H2O_APP_PREFIX=/opt/h2o_app
  14. fi
  15. if [[ -z "$H2O_PREFIX" ]]; then
  16. H2O_PREFIX=/usr
  17. fi
  18. if [[ -z "$MUSTACHE_C_PREFIX" ]]; then
  19. MUSTACHE_C_PREFIX=/opt/mustache-c
  20. fi
  21. # A hacky way to detect whether we are running in the physical hardware or the cloud environment.
  22. if [[ "$CPU_COUNT" -gt 16 ]]; then
  23. echo "Running h2o_app in the physical hardware environment."
  24. DB_CONN=5
  25. else
  26. echo "Running h2o_app in the cloud environment."
  27. DB_CONN=5
  28. fi
  29. build_h2o_app()
  30. {
  31. cmake -DCMAKE_INSTALL_PREFIX="$H2O_APP_PREFIX" -DCMAKE_BUILD_TYPE=Release \
  32. -DCMAKE_PREFIX_PATH="${H2O_PREFIX};${MUSTACHE_C_PREFIX}" \
  33. -DCMAKE_C_FLAGS="-march=native $1" "$H2O_APP_SRC_ROOT"
  34. make -j "$CPU_COUNT"
  35. }
  36. run_curl()
  37. {
  38. for ((i = 0; i < 10; i++)); do
  39. curl "${H2O_APP_PROFILE_URL}/$1" > /dev/null 2>&1
  40. done
  41. }
  42. run_h2o_app()
  43. {
  44. LD_LIBRARY_PATH="${MUSTACHE_C_PREFIX}/lib:$LD_LIBRARY_PATH" \
  45. taskset -c "$1" "$2/h2o_app" -a20 -f "$3/template" -m "$DB_CONN" "$4" "$5" \
  46. -d "host=$DBHOST dbname=hello_world user=benchmarkdbuser sslmode=disable \
  47. password=benchmarkdbpass" &
  48. }
  49. generate_profile_data()
  50. {
  51. run_h2o_app 0 . "$H2O_APP_SRC_ROOT" "-p$H2O_APP_PROFILE_PORT" -t1
  52. local -r H2O_APP_PROFILE_PID=$!
  53. while ! curl "$H2O_APP_PROFILE_URL" > /dev/null 2>&1; do sleep 1; done
  54. run_curl json
  55. run_curl db
  56. run_curl queries?queries=20
  57. run_curl fortunes
  58. run_curl updates?queries=20
  59. run_curl plaintext
  60. run_curl cached-worlds?queries=20
  61. kill -s SIGTERM "$H2O_APP_PROFILE_PID"
  62. wait "$H2O_APP_PROFILE_PID"
  63. }
  64. install -d "$H2O_APP_BUILD_DIR"
  65. pushd "$H2O_APP_BUILD_DIR"
  66. build_h2o_app "-fprofile-generate"
  67. generate_profile_data
  68. make clean
  69. rm -f CMakeCache.txt
  70. build_h2o_app "-fprofile-use"
  71. make -j "$CPU_COUNT" install
  72. popd
  73. rm -rf "$H2O_APP_BUILD_DIR"
  74. echo "Maximum database connections per thread: $DB_CONN"
  75. run_h2o_app 0 "${H2O_APP_PREFIX}/bin" "${H2O_APP_PREFIX}/share/h2o_app"
  76. wait