代码拉取完成,页面将自动刷新
// Copyright 2016 The Cockroach Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.
// +build !stdmalloc
package status
// #cgo CPPFLAGS: -DJEMALLOC_NO_DEMANGLE
// #cgo LDFLAGS: -ljemalloc
// // On macOS, je_zone_register is run at init time to register
// // jemalloc with the system allocator. Unfortunately, all the
// // machinery for this is in a single file, and is not referenced
// // elsewhere, causing the linker to omit the file's symbols.
// // Manually force the presence of these symbols on macOS.
// #cgo darwin LDFLAGS: -u_je_zone_register
// #cgo dragonfly freebsd LDFLAGS: -lm
// #cgo linux LDFLAGS: -lrt -lm -lpthread
//
// #include <jemalloc/jemalloc.h>
//
// // https://github.com/jemalloc/jemalloc/wiki/Use-Case:-Introspection-Via-mallctl*()
// // https://github.com/jemalloc/jemalloc/blob/4.5.0/src/stats.c#L960:L969
//
// typedef struct {
// size_t Allocated;
// size_t Active;
// size_t Metadata;
// size_t Resident;
// size_t Mapped;
// size_t Retained;
// } JemallocStats;
//
// int jemalloc_get_stats(JemallocStats *stats) {
// // Update the statistics cached by je_mallctl.
// uint64_t epoch = 1;
// size_t sz = sizeof(epoch);
// je_mallctl("epoch", &epoch, &sz, &epoch, sz);
//
// int err;
//
// sz = sizeof(&stats->Allocated);
// err = je_mallctl("stats.allocated", &stats->Allocated, &sz, NULL, 0);
// if (err != 0) {
// return err;
// }
// sz = sizeof(&stats->Active);
// err = je_mallctl("stats.active", &stats->Active, &sz, NULL, 0);
// if (err != 0) {
// return err;
// }
// sz = sizeof(&stats->Metadata);
// err = je_mallctl("stats.metadata", &stats->Metadata, &sz, NULL, 0);
// if (err != 0) {
// return err;
// }
// sz = sizeof(&stats->Resident);
// err = je_mallctl("stats.resident", &stats->Resident, &sz, NULL, 0);
// if (err != 0) {
// return err;
// }
// sz = sizeof(&stats->Mapped);
// err = je_mallctl("stats.mapped", &stats->Mapped, &sz, NULL, 0);
// if (err != 0) {
// return err;
// }
// sz = sizeof(&stats->Retained);
// err = je_mallctl("stats.retained", &stats->Retained, &sz, NULL, 0);
// if (err != 0) {
// return err;
// }
// return err;
// }
import "C"
import (
"math"
"reflect"
"strings"
"github.com/dustin/go-humanize"
"golang.org/x/net/context"
"github.com/cockroachdb/cockroach/pkg/util/log"
)
func init() {
if getCgoMemStats != nil {
panic("getCgoMemStats is already set")
}
getCgoMemStats = getJemallocStats
}
func getJemallocStats(ctx context.Context) (uint, uint, error) {
var js C.JemallocStats
// TODO(marc): should we panic here? Failure on fetching the stats may be a problem.
if _, err := C.jemalloc_get_stats(&js); err != nil {
return 0, 0, err
}
if log.V(2) {
// Summary of jemalloc stats:
v := reflect.ValueOf(js)
t := v.Type()
stats := make([]string, v.NumField())
for i := 0; i < v.NumField(); i++ {
stats[i] = t.Field(i).Name + ": " + humanize.IBytes(uint64(v.Field(i).Interface().(C.size_t)))
}
log.Infof(ctx, "jemalloc stats: %s", strings.Join(stats, " "))
}
// NB: the `!V(MaxInt32)` condition is a workaround to not spew this to the
// logs whenever log interception (log spy) is active. If we refactored
// je_malloc_stats_print to return a string that we can `log.Infof` instead,
// we wouldn't need this.
if log.V(3) && !log.V(math.MaxInt32) {
// Detailed jemalloc stats (very verbose, includes per-arena stats).
C.je_malloc_stats_print(nil, nil, nil)
}
return uint(js.Allocated), uint(js.Resident), nil
}
// Used to force allocation in tests. 'import "C"' is not supported in tests.
func allocateMemory() {
// Empirically, 8KiB is not enough, but 16KiB is.
C.malloc(16 << 10)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。