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 <jiehu...@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 <jiehu...@fb.com> Reviewers: Michael Han <h...@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