From c859c16708cdddd11572ea02d50bea38a66d0474 Mon Sep 17 00:00:00 2001 From: Alexey Lebedeff Date: Thu, 18 Feb 2016 12:14:28 +0300 Subject: [PATCH] Unconditionally enable hipe-compilation As it promises significant performance gains Per https://mirantis.jira.com/browse/PROD-3208 Change-Id: Idd9b024c03cbef0732a3c10aee0138cd6cd4c676 --- debian/changelog | 6 +++ debian/control | 7 +-- debian/rabbitmq-server.default | 5 +- debian/rabbitmq-server.postinst | 71 +++++++++++++++++++++++++ rabbitmq-server/scripts/rabbitmq-server | 1 + 5 files changed, 85 insertions(+), 5 deletions(-) mode change 100644 => 100755 debian/rabbitmq-server.postinst diff --git a/debian/changelog b/debian/changelog index 61b1bd2..eb7e9ef 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +rabbitmq-server (3.6.1-1~u14.04+mos2) mos8.0; urgency=medium + + * Use HiPE compilation. + + -- Alexey Lebedeff Mon, 29 Feb 2016 14:00:50 +0300 + rabbitmq-server (3.6.1-1~u14.04+mos1) mos8.0; urgency=medium * New upstream release. diff --git a/debian/control b/debian/control index 66cb55f..6388df8 100644 --- a/debian/control +++ b/debian/control @@ -6,8 +6,8 @@ Uploaders: James Page , Thomas Goirand 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 diff --git a/debian/rabbitmq-server.default b/debian/rabbitmq-server.default index 3eebe2f..51acac3 100644 --- a/debian/rabbitmq-server.default +++ b/debian/rabbitmq-server.default @@ -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 diff --git a/debian/rabbitmq-server.postinst b/debian/rabbitmq-server.postinst old mode 100644 new mode 100755 index b11340e..5927e7a --- a/debian/rabbitmq-server.postinst +++ b/debian/rabbitmq-server.postinst @@ -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) diff --git a/rabbitmq-server/scripts/rabbitmq-server b/rabbitmq-server/scripts/rabbitmq-server index 548a085..6538778 100755 --- a/rabbitmq-server/scripts/rabbitmq-server +++ b/rabbitmq-server/scripts/rabbitmq-server @@ -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} \ -- 2.45.2