This is an automated email from the ASF dual-hosted git repository.
hanm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push:
new b1e67ca ZOOKEEPER-3847: Add a couple metrics to help track Netty memory usage
b1e67ca is described below
commit b1e67ca2807f836592ec0106c0c38e3ce997ee8e
Author: Jie Huang <jiehuang@fb.com>
AuthorDate: Wed May 27 20:43:25 2020 -0700
ZOOKEEPER-3847: Add a couple metrics to help track Netty memory usage
Author: Jie Huang <jiehuang@fb.com>
Reviewers: Michael Han <hanm@apache.org>
Closes #1367 from jhuan31/ZOOKEEPER-3847
---
.../main/java/org/apache/zookeeper/server/DumbWatcher.java | 3 ++-
.../org/apache/zookeeper/server/FinalRequestProcessor.java | 13 ++++++++-----
.../java/org/apache/zookeeper/server/NIOServerCnxn.java | 12 +++++++++---
.../java/org/apache/zookeeper/server/NettyServerCnxn.java | 13 +++++++++----
.../main/java/org/apache/zookeeper/server/ServerCnxn.java | 6 +++---
.../java/org/apache/zookeeper/server/ServerMetrics.java | 9 +++++++++
.../java/org/apache/zookeeper/server/MockServerCnxn.java | 3 ++-
7 files changed, 42 insertions(+), 17 deletions(-)
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/DumbWatcher.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/DumbWatcher.java
index 9b9672a..c7bf830 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/DumbWatcher.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/DumbWatcher.java
@@ -61,8 +61,9 @@ public class DumbWatcher extends ServerCnxn {
}
@Override
- public void sendResponse(ReplyHeader h, Record r, String tag,
+ public int sendResponse(ReplyHeader h, Record r, String tag,
String cacheKey, Stat stat, int opCode) throws IOException {
+ return 0;
}
@Override
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/FinalRequestProcessor.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/FinalRequestProcessor.java
index a487626..a23e903 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/FinalRequestProcessor.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/FinalRequestProcessor.java
@@ -171,6 +171,7 @@ public class FinalRequestProcessor implements RequestProcessor {
Code err = Code.OK;
Record rsp = null;
String path = null;
+ int responseSize = 0;
try {
if (request.getHdr() != null && request.getHdr().getType() == OpCode.error)
{
AuditHelper.addAuditLog(request, rc, true);
@@ -213,7 +214,7 @@ public class FinalRequestProcessor implements RequestProcessor {
lastOp = "PING";
updateStats(request, lastOp, lastZxid);
- cnxn.sendResponse(new ReplyHeader(ClientCnxn.PING_XID, lastZxid, 0), null,
"response");
+ responseSize = cnxn.sendResponse(new ReplyHeader(ClientCnxn.PING_XID, lastZxid,
0), null, "response");
return;
}
case OpCode.createSession: {
@@ -599,7 +600,7 @@ public class FinalRequestProcessor implements RequestProcessor {
try {
if (path == null || rsp == null) {
- cnxn.sendResponse(hdr, rsp, "response");
+ responseSize = cnxn.sendResponse(hdr, rsp, "response");
} else {
int opCode = request.type;
Stat stat = null;
@@ -610,17 +611,17 @@ public class FinalRequestProcessor implements RequestProcessor {
case OpCode.getData : {
GetDataResponse getDataResponse = (GetDataResponse) rsp;
stat = getDataResponse.getStat();
- cnxn.sendResponse(hdr, rsp, "response", path, stat, opCode);
+ responseSize = cnxn.sendResponse(hdr, rsp, "response", path, stat,
opCode);
break;
}
case OpCode.getChildren2 : {
GetChildren2Response getChildren2Response = (GetChildren2Response)
rsp;
stat = getChildren2Response.getStat();
- cnxn.sendResponse(hdr, rsp, "response", path, stat, opCode);
+ responseSize = cnxn.sendResponse(hdr, rsp, "response", path, stat,
opCode);
break;
}
default:
- cnxn.sendResponse(hdr, rsp, "response");
+ responseSize = cnxn.sendResponse(hdr, rsp, "response");
}
}
@@ -629,6 +630,8 @@ public class FinalRequestProcessor implements RequestProcessor {
}
} catch (IOException e) {
LOG.error("FIXMSG", e);
+ } finally {
+ ServerMetrics.getMetrics().RESPONSE_BYTES.add(responseSize);
}
}
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxn.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxn.java
index 86fe85d..f967fff 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxn.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxn.java
@@ -665,13 +665,18 @@ public class NIOServerCnxn extends ServerCnxn {
private static final ByteBuffer packetSentinel = ByteBuffer.allocate(0);
@Override
- public void sendResponse(ReplyHeader h, Record r, String tag, String cacheKey, Stat stat,
int opCode) {
+ public int sendResponse(ReplyHeader h, Record r, String tag, String cacheKey, Stat stat,
int opCode) {
+ int responseSize = 0;
try {
- sendBuffer(serialize(h, r, tag, cacheKey, stat, opCode));
+ ByteBuffer[] bb = serialize(h, r, tag, cacheKey, stat, opCode);
+ responseSize = bb[0].getInt();
+ bb[0].rewind();
+ sendBuffer(bb);
decrOutstandingAndCheckThrottle(h);
} catch (Exception e) {
LOG.warn("Unexpected exception. Destruction averted.", e);
}
+ return responseSize;
}
/*
@@ -695,7 +700,8 @@ public class NIOServerCnxn extends ServerCnxn {
// The last parameter OpCode here is used to select the response cache.
// Passing OpCode.error (with a value of -1) means we don't care, as we don't need
// response cache on delivering watcher events.
- sendResponse(h, e, "notification", null, null, ZooDefs.OpCode.error);
+ int responseSize = sendResponse(h, e, "notification", null, null, ZooDefs.OpCode.error);
+ ServerMetrics.getMetrics().WATCH_BYTES.add(responseSize);
}
/*
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NettyServerCnxn.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NettyServerCnxn.java
index 442f39d..cf9aa45 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NettyServerCnxn.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NettyServerCnxn.java
@@ -168,7 +168,8 @@ public class NettyServerCnxn extends ServerCnxn {
WatcherEvent e = event.getWrapper();
try {
- sendResponse(h, e, "notification");
+ int responseSize = sendResponse(h, e, "notification");
+ ServerMetrics.getMetrics().WATCH_BYTES.add(responseSize);
} catch (IOException e1) {
LOG.debug("Problem sending to {}", getRemoteSocketAddress(), e1);
close();
@@ -176,15 +177,19 @@ public class NettyServerCnxn extends ServerCnxn {
}
@Override
- public void sendResponse(ReplyHeader h, Record r, String tag,
+ public int sendResponse(ReplyHeader h, Record r, String tag,
String cacheKey, Stat stat, int opCode) throws IOException {
// cacheKey and stat are used in caching, which is not
// implemented here. Implementation example can be found in NIOServerCnxn.
if (closingChannel || !channel.isOpen()) {
- return;
+ return 0;
}
- sendBuffer(serialize(h, r, tag, cacheKey, stat, opCode));
+ ByteBuffer[] bb = serialize(h, r, tag, cacheKey, stat, opCode);
+ int responseSize = bb[0].getInt();
+ bb[0].rewind();
+ sendBuffer(bb);
decrOutstandingAndCheckThrottle(h);
+ return responseSize;
}
@Override
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerCnxn.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerCnxn.java
index d70551a..78dc8fa 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerCnxn.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerCnxn.java
@@ -186,11 +186,11 @@ public abstract class ServerCnxn implements Stats, Watcher {
* used to decide which cache (e.g. read response cache,
* list of children response cache, ...) object to look up to when applicable.
*/
- public abstract void sendResponse(ReplyHeader h, Record r, String tag,
+ public abstract int sendResponse(ReplyHeader h, Record r, String tag,
String cacheKey, Stat stat, int opCode) throws IOException;
- public void sendResponse(ReplyHeader h, Record r, String tag) throws IOException {
- sendResponse(h, r, tag, null, null, -1);
+ public int sendResponse(ReplyHeader h, Record r, String tag) throws IOException {
+ return sendResponse(h, r, tag, null, null, -1);
}
protected byte[] serializeRecord(Record record) throws IOException {
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
index 3962bb9..4d71e51 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java
@@ -243,6 +243,9 @@ public final class ServerMetrics {
REQUESTS_NOT_FORWARDED_TO_COMMIT_PROCESSOR = metricsContext.getCounter(
"requests_not_forwarded_to_commit_processor");
+
+ RESPONSE_BYTES = metricsContext.getCounter("response_bytes");
+ WATCH_BYTES = metricsContext.getCounter("watch_bytes");
}
/**
@@ -469,6 +472,12 @@ public final class ServerMetrics {
public final Counter REQUESTS_NOT_FORWARDED_TO_COMMIT_PROCESSOR;
+ /**
+ * Number of response/watch bytes written to clients.
+ */
+ public final Counter RESPONSE_BYTES;
+ public final Counter WATCH_BYTES;
+
private final MetricsProvider metricsProvider;
public void resetAll() {
diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/MockServerCnxn.java
b/zookeeper-server/src/test/java/org/apache/zookeeper/server/MockServerCnxn.java
index a82eab3..4dfcebd 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/MockServerCnxn.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/MockServerCnxn.java
@@ -46,8 +46,9 @@ public class MockServerCnxn extends ServerCnxn {
}
@Override
- public void sendResponse(ReplyHeader h, Record r, String tag,
+ public int sendResponse(ReplyHeader h, Record r, String tag,
String cacheKey, Stat stat, int opCode) throws IOException {
+ return 0;
}
@Override
|