setup.sh 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/bin/bash
  2. fw_depends postgresql h2o mustache-c yajl
  3. H2O_APP_HOME="${IROOT}/h2o_app"
  4. BUILD_DIR="${H2O_APP_HOME}_build"
  5. H2O_APP_PROFILE_PORT=54321
  6. H2O_APP_PROFILE_URL="http://127.0.0.1:$H2O_APP_PROFILE_PORT"
  7. NUM_PROC=$(nproc)
  8. PHYSICAL_ENVIRONMENT_THREADS=30
  9. # A hacky way to detect whether we are running in the physical hardware or the cloud environment.
  10. if [[ "$NUM_PROC" -gt 16 ]]; then
  11. CLOUD_ENVIRONMENT=false
  12. # In the physical hardware environment the number of threads used by the application is not
  13. # the same as the number of logical CPU cores that the database server has, so we need to
  14. # adjust the maximum number of database connections per thread accordingly.
  15. DB_CONN=4
  16. else
  17. CLOUD_ENVIRONMENT=true
  18. DB_CONN=16
  19. fi
  20. build_h2o_app()
  21. {
  22. cmake -DCMAKE_INSTALL_PREFIX="$H2O_APP_HOME" -DCMAKE_BUILD_TYPE=Release \
  23. -DCMAKE_LIBRARY_PATH="${H2O_HOME}/lib;${MUSTACHE_C_HOME}/lib;${YAJL_HOME}/lib" \
  24. -DCMAKE_INCLUDE_PATH="${H2O_HOME}/include;${MUSTACHE_C_HOME}/include;${YAJL_HOME}/include" \
  25. -DCMAKE_C_FLAGS="-march=native $1" "$TROOT"
  26. make -j "$(nproc)"
  27. }
  28. run_curl()
  29. {
  30. for ((i = 0; i < 10; i++)); do
  31. curl "${H2O_APP_PROFILE_URL}/$1" > /dev/null 2>&1
  32. done
  33. }
  34. run_h2o_app()
  35. {
  36. taskset -c "$1" "$2/h2o_app" -a20 -f "$3/template/fortunes.mustache" -m "$DB_CONN" "$4" "$5" \
  37. -d "host=TFB-database dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass" &
  38. }
  39. generate_profile_data()
  40. {
  41. run_h2o_app 0 . "${TROOT}" -p$H2O_APP_PROFILE_PORT -t1
  42. local -r H2O_APP_PROFILE_PID=$!
  43. while ! curl ${H2O_APP_PROFILE_URL} > /dev/null 2>&1; do sleep 1; done
  44. run_curl json
  45. run_curl db
  46. run_curl queries?queries=20
  47. run_curl fortunes
  48. run_curl updates?queries=20
  49. run_curl plaintext
  50. kill -s SIGTERM $H2O_APP_PROFILE_PID
  51. wait $H2O_APP_PROFILE_PID
  52. }
  53. install -d "$BUILD_DIR"
  54. pushd "$BUILD_DIR"
  55. build_h2o_app "-fprofile-generate"
  56. generate_profile_data
  57. make clean
  58. rm -f CMakeCache.txt
  59. build_h2o_app "-fprofile-use"
  60. make -j "$(nproc)" install
  61. popd
  62. rm -rf "$BUILD_DIR"
  63. echo "Maximum database connections per thread: $DB_CONN"
  64. if "$CLOUD_ENVIRONMENT"; then
  65. run_h2o_app 0 "${H2O_APP_HOME}/bin" "${H2O_APP_HOME}/share/h2o_app"
  66. else
  67. for ((i = 0; i < PHYSICAL_ENVIRONMENT_THREADS; i++)); do
  68. run_h2o_app "$i" "${H2O_APP_HOME}/bin" "${H2O_APP_HOME}/share/h2o_app" -t1
  69. done
  70. fi