summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Ansari <david.ansari@gmx.de>2021-12-31 01:46:18 +0100
committermergify-bot <noreply@mergify.com>2022-01-01 04:18:16 +0000
commita700018bba95f25beaff0e70f9caeea220d4e585 (patch)
treebcb08eb4ead47bad9dc44fb46c22f81faddd8622
parent2d65faeed8b9816b5d9b4362a1b4356372d00a95 (diff)
downloadrabbitmq-server-git-a700018bba95f25beaff0e70f9caeea220d4e585.tar.gz
Reduce CPU usage of rabbit_framing_amqp_0_9_1:decode_method_fields/2mergify/bp/v3.8.x/pr-3937
This diff will generate module rabbit_framing_amqp_0_9_1 with re-ordered clauses of function decode_method_fields/2. After this change, basic class will be at the top of the function clauses. That's better because for example basic.publish and basic.ack are called far more often than for example methods of class connection, channel or exchange. Note that "the compiler does not rearrange clauses that match binaries." See https://www.erlang.org/doc/efficiency_guide/functions.html#pattern-matching Measurement taken on an Ubuntu 20.04 VM before and after this change: 1. Install latest Erlang from master (i.e. Erlang 25) 2. RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="+JPperf true +S 1" make run-broker (Single scheduler makes the flame graph easier to read.) 3. Run rabbitmq-perf-test without any parameters 4. sudo perf record -g -F 9999 -p <pid> -- sleep 5 where <pid> is the output of 'os:getpid().' (in the Erlang shell). This samples CPU stack traces via frame pointers of rabbitmq-server at 9999 Hertz for 5 seconds. 5. Generate a differential flame graph as described in https://www.brendangregg.com/blog/2014-11-09/differential-flame-graphs.html Before this change, stack frame rabbit_framing_amqp_0_9_1:decode_method_fields/2 was 1.57% present in all stack trackes, most of the time (> 1%) running on the CPU, i.e. directly consuming CPU cycles. This does not sound like a lot, but is actually quite a lot for a single function! The diffential flame graph depicts a single dark blue frame: function decode_method_fields with a reduction of ~0.85%. (cherry picked from commit e10247feeedb529692234c3cacb8ecb1bb6c09e6) (cherry picked from commit 3a1c7eb67f9729e25332266b434792032847d65c)
-rw-r--r--deps/rabbitmq_codegen/amqp-rabbitmq-0.9.1.json224
1 files changed, 112 insertions, 112 deletions
diff --git a/deps/rabbitmq_codegen/amqp-rabbitmq-0.9.1.json b/deps/rabbitmq_codegen/amqp-rabbitmq-0.9.1.json
index c1c2f8baf4..7545f5e0b8 100644
--- a/deps/rabbitmq_codegen/amqp-rabbitmq-0.9.1.json
+++ b/deps/rabbitmq_codegen/amqp-rabbitmq-0.9.1.json
@@ -99,6 +99,118 @@
"classes": [
{
+ "id": 60,
+ "methods": [{"id": 10,
+ "arguments": [{"type": "long", "name": "prefetch-size", "default-value": 0},
+ {"type": "short", "name": "prefetch-count", "default-value": 0},
+ {"type": "bit", "name": "global", "default-value": false}],
+ "name": "qos",
+ "synchronous" : true},
+ {"id": 11,
+ "arguments": [],
+ "name": "qos-ok"},
+ {"id": 20,
+ "arguments": [{"domain": "short", "name": "ticket", "default-value": 0},
+ {"domain": "queue-name", "name": "queue", "default-value": ""},
+ {"type": "shortstr", "name": "consumer-tag", "default-value": ""},
+ {"type": "bit", "name": "no-local", "default-value": false},
+ {"type": "bit", "name": "no-ack", "default-value": false},
+ {"type": "bit", "name": "exclusive", "default-value": false},
+ {"type": "bit", "name": "nowait", "default-value": false},
+ {"type": "table", "name": "arguments", "default-value": {}}],
+ "name": "consume",
+ "synchronous" : true},
+ {"id": 21,
+ "arguments": [{"type": "shortstr", "name": "consumer-tag"}],
+ "name": "consume-ok"},
+ {"id": 30,
+ "arguments": [{"type": "shortstr", "name": "consumer-tag"},
+ {"type": "bit", "name": "nowait", "default-value": false}],
+ "name": "cancel",
+ "synchronous" : true},
+ {"id": 31,
+ "arguments": [{"type": "shortstr", "name": "consumer-tag"}],
+ "name": "cancel-ok"},
+ {"content": true,
+ "id": 40,
+ "arguments": [{"type": "short", "name": "ticket", "default-value": 0},
+ {"domain": "exchange-name", "name": "exchange", "default-value": ""},
+ {"type": "shortstr", "name": "routing-key", "default-value": ""},
+ {"type": "bit", "name": "mandatory", "default-value": false},
+ {"type": "bit", "name": "immediate", "default-value": false}],
+ "name": "publish"},
+ {"content": true,
+ "id": 50,
+ "arguments": [{"type": "short", "name": "reply-code"},
+ {"type": "shortstr", "name": "reply-text", "default-value": ""},
+ {"domain": "exchange-name", "name": "exchange"},
+ {"type": "shortstr", "name": "routing-key"}],
+ "name": "return"},
+ {"content": true,
+ "id": 60,
+ "arguments": [{"type": "shortstr", "name": "consumer-tag"},
+ {"type": "longlong", "name": "delivery-tag"},
+ {"type": "bit", "name": "redelivered", "default-value": false},
+ {"domain": "exchange-name", "name": "exchange"},
+ {"type": "shortstr", "name": "routing-key"}],
+ "name": "deliver"},
+ {"id": 70,
+ "arguments": [{"type": "short", "name": "ticket", "default-value": 0},
+ {"domain": "queue-name", "name": "queue", "default-value": ""},
+ {"type": "bit", "name": "no-ack", "default-value": false}],
+ "name": "get",
+ "synchronous" : true},
+ {"content": true,
+ "id": 71,
+ "arguments": [{"type": "longlong", "name": "delivery-tag"},
+ {"type": "bit", "name": "redelivered", "default-value": false},
+ {"domain": "exchange-name", "name": "exchange"},
+ {"type": "shortstr", "name": "routing-key"},
+ {"domain": "message-count", "name": "message-count"}],
+ "name": "get-ok"},
+ {"id": 72,
+ "arguments": [{"type": "shortstr", "name": "cluster-id", "default-value": ""}],
+ "name": "get-empty"},
+ {"id": 80,
+ "arguments": [{"type": "longlong", "name": "delivery-tag", "default-value": 0},
+ {"type": "bit", "name": "multiple", "default-value": false}],
+ "name": "ack"},
+ {"id": 90,
+ "arguments": [{"type": "longlong", "name": "delivery-tag"},
+ {"type": "bit", "name": "requeue", "default-value": true}],
+ "name": "reject"},
+ {"id": 100,
+ "arguments": [{"type": "bit", "name": "requeue", "default-value": false}],
+ "name": "recover-async"},
+ {"id": 110,
+ "arguments": [{"type": "bit", "name": "requeue", "default-value": false}],
+ "name": "recover",
+ "synchronous" : true},
+ {"id": 111,
+ "arguments": [],
+ "name": "recover-ok"},
+ {"id": 120,
+ "arguments": [{"type": "longlong", "name": "delivery-tag", "default-value": 0},
+ {"type": "bit", "name": "multiple", "default-value": false},
+ {"type": "bit", "name": "requeue", "default-value": true}],
+ "name": "nack"}],
+ "name": "basic",
+ "properties": [{"type": "shortstr", "name": "content-type"},
+ {"type": "shortstr", "name": "content-encoding"},
+ {"type": "table", "name": "headers"},
+ {"type": "octet", "name": "delivery-mode"},
+ {"type": "octet", "name": "priority"},
+ {"type": "shortstr", "name": "correlation-id"},
+ {"type": "shortstr", "name": "reply-to"},
+ {"type": "shortstr", "name": "expiration"},
+ {"type": "shortstr", "name": "message-id"},
+ {"type": "timestamp", "name": "timestamp"},
+ {"type": "shortstr", "name": "type"},
+ {"type": "shortstr", "name": "user-id"},
+ {"type": "shortstr", "name": "app-id"},
+ {"type": "shortstr", "name": "cluster-id"}]
+ },
+ {
"id": 10,
"methods": [{"id": 10,
"arguments": [{"type": "octet", "name": "version-major", "default-value": 0},
@@ -331,118 +443,6 @@
"name": "queue"
},
{
- "id": 60,
- "methods": [{"id": 10,
- "arguments": [{"type": "long", "name": "prefetch-size", "default-value": 0},
- {"type": "short", "name": "prefetch-count", "default-value": 0},
- {"type": "bit", "name": "global", "default-value": false}],
- "name": "qos",
- "synchronous" : true},
- {"id": 11,
- "arguments": [],
- "name": "qos-ok"},
- {"id": 20,
- "arguments": [{"domain": "short", "name": "ticket", "default-value": 0},
- {"domain": "queue-name", "name": "queue", "default-value": ""},
- {"type": "shortstr", "name": "consumer-tag", "default-value": ""},
- {"type": "bit", "name": "no-local", "default-value": false},
- {"type": "bit", "name": "no-ack", "default-value": false},
- {"type": "bit", "name": "exclusive", "default-value": false},
- {"type": "bit", "name": "nowait", "default-value": false},
- {"type": "table", "name": "arguments", "default-value": {}}],
- "name": "consume",
- "synchronous" : true},
- {"id": 21,
- "arguments": [{"type": "shortstr", "name": "consumer-tag"}],
- "name": "consume-ok"},
- {"id": 30,
- "arguments": [{"type": "shortstr", "name": "consumer-tag"},
- {"type": "bit", "name": "nowait", "default-value": false}],
- "name": "cancel",
- "synchronous" : true},
- {"id": 31,
- "arguments": [{"type": "shortstr", "name": "consumer-tag"}],
- "name": "cancel-ok"},
- {"content": true,
- "id": 40,
- "arguments": [{"type": "short", "name": "ticket", "default-value": 0},
- {"domain": "exchange-name", "name": "exchange", "default-value": ""},
- {"type": "shortstr", "name": "routing-key", "default-value": ""},
- {"type": "bit", "name": "mandatory", "default-value": false},
- {"type": "bit", "name": "immediate", "default-value": false}],
- "name": "publish"},
- {"content": true,
- "id": 50,
- "arguments": [{"type": "short", "name": "reply-code"},
- {"type": "shortstr", "name": "reply-text", "default-value": ""},
- {"domain": "exchange-name", "name": "exchange"},
- {"type": "shortstr", "name": "routing-key"}],
- "name": "return"},
- {"content": true,
- "id": 60,
- "arguments": [{"type": "shortstr", "name": "consumer-tag"},
- {"type": "longlong", "name": "delivery-tag"},
- {"type": "bit", "name": "redelivered", "default-value": false},
- {"domain": "exchange-name", "name": "exchange"},
- {"type": "shortstr", "name": "routing-key"}],
- "name": "deliver"},
- {"id": 70,
- "arguments": [{"type": "short", "name": "ticket", "default-value": 0},
- {"domain": "queue-name", "name": "queue", "default-value": ""},
- {"type": "bit", "name": "no-ack", "default-value": false}],
- "name": "get",
- "synchronous" : true},
- {"content": true,
- "id": 71,
- "arguments": [{"type": "longlong", "name": "delivery-tag"},
- {"type": "bit", "name": "redelivered", "default-value": false},
- {"domain": "exchange-name", "name": "exchange"},
- {"type": "shortstr", "name": "routing-key"},
- {"domain": "message-count", "name": "message-count"}],
- "name": "get-ok"},
- {"id": 72,
- "arguments": [{"type": "shortstr", "name": "cluster-id", "default-value": ""}],
- "name": "get-empty"},
- {"id": 80,
- "arguments": [{"type": "longlong", "name": "delivery-tag", "default-value": 0},
- {"type": "bit", "name": "multiple", "default-value": false}],
- "name": "ack"},
- {"id": 90,
- "arguments": [{"type": "longlong", "name": "delivery-tag"},
- {"type": "bit", "name": "requeue", "default-value": true}],
- "name": "reject"},
- {"id": 100,
- "arguments": [{"type": "bit", "name": "requeue", "default-value": false}],
- "name": "recover-async"},
- {"id": 110,
- "arguments": [{"type": "bit", "name": "requeue", "default-value": false}],
- "name": "recover",
- "synchronous" : true},
- {"id": 111,
- "arguments": [],
- "name": "recover-ok"},
- {"id": 120,
- "arguments": [{"type": "longlong", "name": "delivery-tag", "default-value": 0},
- {"type": "bit", "name": "multiple", "default-value": false},
- {"type": "bit", "name": "requeue", "default-value": true}],
- "name": "nack"}],
- "name": "basic",
- "properties": [{"type": "shortstr", "name": "content-type"},
- {"type": "shortstr", "name": "content-encoding"},
- {"type": "table", "name": "headers"},
- {"type": "octet", "name": "delivery-mode"},
- {"type": "octet", "name": "priority"},
- {"type": "shortstr", "name": "correlation-id"},
- {"type": "shortstr", "name": "reply-to"},
- {"type": "shortstr", "name": "expiration"},
- {"type": "shortstr", "name": "message-id"},
- {"type": "timestamp", "name": "timestamp"},
- {"type": "shortstr", "name": "type"},
- {"type": "shortstr", "name": "user-id"},
- {"type": "shortstr", "name": "app-id"},
- {"type": "shortstr", "name": "cluster-id"}]
- },
- {
"id": 90,
"methods": [{"id": 10,
"arguments": [],