cherry pick #487 to release-3.1 (#495)

Signed-off-by: ti-srebot <ti-srebot@pingcap.com>

Co-authored-by: iosmanthus <dengliming@pingcap.com>
Co-authored-by: Liangliang Gu <marsishandsome@gmail.com>
This commit is contained in:
ti-srebot 2022-01-21 17:08:08 +08:00 committed by GitHub
parent 5cd888b88a
commit 7f4fb953d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 29 additions and 0 deletions

View File

@ -22,6 +22,8 @@ import static java.lang.Math.max;
import io.netty.util.internal.LongCounter;
import io.netty.util.internal.PlatformDependent;
import io.netty.util.internal.StringUtil;
import io.prometheus.client.Counter;
import io.prometheus.client.Histogram;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
@ -29,6 +31,21 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
abstract class PoolArena<T> extends SizeClasses implements PoolArenaMetric {
public static final Counter poolArenaAllocations =
Counter.build()
.name("netty_buffer_pool_arena_allocations")
.help("Number of times a pool arena was allocated")
.labelNames("type")
.register();
public static final Histogram poolArenaAllocationsDuration =
Histogram.build()
.name("netty_buffer_pool_arena_allocations_duration_seconds")
.help("Duration of a pool arena allocation")
.labelNames("type")
.register();
static final boolean HAS_UNSAFE = PlatformDependent.hasUnsafe();
enum SizeClass {
@ -136,13 +153,25 @@ abstract class PoolArena<T> extends SizeClasses implements PoolArenaMetric {
final int sizeIdx = size2SizeIdx(reqCapacity);
if (sizeIdx <= smallMaxSizeIdx) {
Histogram.Timer smallAllocationTimer =
poolArenaAllocationsDuration.labels("small").startTimer();
tcacheAllocateSmall(cache, buf, reqCapacity, sizeIdx);
smallAllocationTimer.observeDuration();
poolArenaAllocations.labels("small").inc();
} else if (sizeIdx < nSizes) {
Histogram.Timer normalAllocationTimer =
poolArenaAllocationsDuration.labels("normal").startTimer();
tcacheAllocateNormal(cache, buf, reqCapacity, sizeIdx);
normalAllocationTimer.observeDuration();
poolArenaAllocations.labels("normal").inc();
} else {
Histogram.Timer hugeAllocationTimer =
poolArenaAllocationsDuration.labels("huge").startTimer();
int normCapacity = directMemoryCacheAlignment > 0 ? normalizeSize(reqCapacity) : reqCapacity;
// Huge allocations are never served via the cache so just call allocateHuge
allocateHuge(buf, normCapacity);
hugeAllocationTimer.observeDuration();
poolArenaAllocations.labels("huge").inc();
}
}