Unconditionally enable hipe-compilation 20/17620/5
authorAlexey Lebedeff <alebedev@mirantis.com>
Thu, 18 Feb 2016 09:14:28 +0000 (12:14 +0300)
committerAlexey Lebedeff <alebedev@mirantis.com>
Tue, 1 Mar 2016 19:16:29 +0000 (22:16 +0300)
As it promises significant performance gains

Per https://mirantis.jira.com/browse/PROD-3208

Change-Id: Idd9b024c03cbef0732a3c10aee0138cd6cd4c676

debian/changelog
debian/control
debian/rabbitmq-server.default
debian/rabbitmq-server.postinst [changed mode: 0644->0755]
rabbitmq-server/scripts/rabbitmq-server

index 61b1bd28f42cb38b88f55841989f46db2d7bc0bd..eb7e9efeb1e80c9c0c32a022cb23040c3c214b11 100644 (file)
@@ -1,3 +1,9 @@
+rabbitmq-server (3.6.1-1~u14.04+mos2) mos8.0; urgency=medium
+
+  * Use HiPE compilation.
+
+ -- Alexey Lebedeff <alebedev@mirantis.com>  Mon, 29 Feb 2016 14:00:50 +0300
+
 rabbitmq-server (3.6.1-1~u14.04+mos1) mos8.0; urgency=medium
 
   * New upstream release.
index 66cb55f33802f6d318fc2ef1aebb780f3d132962..6388df80c0d9bcd651841c0091faeed72be6d3a9 100644 (file)
@@ -6,8 +6,8 @@ Uploaders: James Page <james.page@ubuntu.com>, Thomas Goirand <zigo@debian.org>
 Build-Depends: debhelper (>= 9~),
                dh-systemd (>= 1.5),
                erlang-dev,
-               erlang-nox (>= 1:13.b.3),
-               erlang-src (>= 1:13.b.3),
+               erlang-nox (>= 1:18.1),
+               erlang-src (>= 1:18.1),
                python-simplejson,
                rsync,
                unzip,
@@ -22,7 +22,8 @@ Homepage: http://www.rabbitmq.com/
 Package: rabbitmq-server
 Architecture: all
 Depends: adduser,
-         erlang-nox (>= 1:13.b.3) | esl-erlang,
+         erlang-nox (>= 1:18.1),
+         erlang-base-hipe (>= 1:18.1),
          logrotate,
          ${misc:Depends}
 Description: AMQP server written in Erlang
index 3eebe2fab5283d62c11a6b41e3f10e17705e2b44..51acac35e703da86f536f7945e1c7fb02e3cd86d 100644 (file)
@@ -12,5 +12,6 @@
 # recommends to allow for at least 65536 open file descriptors in
 # production. Values were chosen in
 # https://bugs.launchpad.net/fuel/+bug/1279594
-ulimit -H -n 105472
-ulimit -S -n 102400
+ulimit -H -n 105472 || true
+ulimit -S -n 102400 || true
+ulimit -H -n 105472 || true
old mode 100644 (file)
new mode 100755 (executable)
index b11340e..5927e7a
@@ -33,12 +33,83 @@ fi
 chown -R rabbitmq:rabbitmq /var/lib/rabbitmq
 chown -R rabbitmq:rabbitmq /var/log/rabbitmq
 
+HIPE_DIRECTORY=/var/lib/rabbitmq/native-code
+
+ensure_erlang_cookie () {
+    HOME=/root/ erl -noinput -sname root-cookie-ensure-$$ -s init stop
+    echo "$(cat $HOME/.erlang.cookie)"
+}
+
+ensure_hipe_starter () {
+    local cookie="$1"
+    HOME=/root \
+    RABBITMQ_NODENAME=rabbit-hipe-compiler@localhost \
+    RABBITMQ_NODE_ONLY=true \
+    RABBITMQ_NODE_PORT=65000 \
+    RABBITMQ_DIST_PORT=65001 \
+    RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-cookie \"$cookie\"" \
+    /usr/lib/rabbitmq/bin/rabbitmq-server -detached
+}
+
+hipe_starter_eval () {
+    local cookie="$1"
+    local code="$2"
+    HOME=/root \
+    RABBITMQ_NODENAME=rabbit-hipe-compiler@localhost \
+    RABBITMQ_CTL_ERL_ARGS="-cookie \"$cookie\"" \
+    /usr/lib/rabbitmq/bin/rabbitmqctl eval "$code"
+}
+
+hipe_compile () {
+    local retry_no
+    local cookie
+
+    rm -rf ${HIPE_DIRECTORY}
+    mkdir -p ${HIPE_DIRECTORY}
+
+    pkill -f rabbit-hipe-compiler || true
+
+    cookie="$(ensure_erlang_cookie)"
+    ensure_hipe_starter "$cookie"
+
+    for retry_no in $(seq 1 10); do
+        if hipe_starter_eval "$cookie" "1." > /dev/null 2>&1 ; then
+            break
+        fi
+    done
+
+    # Don't check whether we've found running node in the loop above - following eval call will catch
+    # this error naturally.
+    hipe_starter_eval "$cookie" "
+application:load(rabbit),
+application:load(rabbit_common),
+{ok, Mods} = application:get_env(rabbit, hipe_modules),
+ModsToDump = [ Mod || Mod <- Mods, Mod:module_info(native) =:= false ],
+[ begin
+    {M, BeamCode, _} = code:get_object_code(M),
+    BeamName = \"${HIPE_DIRECTORY}/\" ++ atom_to_list(M) ++ \".beam\",
+    {ok, {Architecture, NativeCode}} = hipe:compile(M, [], BeamCode, [o3]),
+    {ok, _, Chunks0} = beam_lib:all_chunks(BeamCode),
+    ChunkName = hipe_unified_loader:chunk_name(Architecture),
+    Chunks1 = lists:keydelete(ChunkName, 1, Chunks0),
+    Chunks = Chunks1 ++ [{ChunkName,NativeCode}],
+    {ok, BeamPlusNative} = beam_lib:build_module(Chunks),
+    file:write_file(BeamName, BeamPlusNative),
+    M
+  end
+  || M <- ModsToDump ].
+"
+
+    pkill -f rabbit-hipe-compiler || true
+}
+
 case "$1" in
     configure)
         if [ -f /etc/rabbitmq/rabbitmq.conf ] && \
            [ ! -f /etc/rabbitmq/rabbitmq-env.conf ]; then
             mv /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/rabbitmq-env.conf
         fi
+        hipe_compile
     ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
index 548a085434ef759d51c4ba5acccb9da39791e115..65387788d063922ff97e6cf4c3fc10730d13f7d3 100755 (executable)
@@ -115,6 +115,7 @@ set -f
 start_rabbitmq_server() {
     RABBITMQ_CONFIG_FILE=$RABBITMQ_CONFIG_FILE \
     exec ${ERL_DIR}erl \
+    -pa /var/lib/rabbitmq/native-code \
         -pa ${RABBITMQ_EBIN_ROOT} \
         ${RABBITMQ_START_RABBIT} \
         ${RABBITMQ_NAME_TYPE} ${RABBITMQ_NODENAME} \