ethdb: add write delay meters

This commit is contained in:
rjl493456442 2017-12-13 14:01:03 +08:00
parent a30dc0ce7c
commit 61920f6600

View file

@ -30,6 +30,7 @@ import (
"github.com/syndtr/goleveldb/leveldb/iterator" "github.com/syndtr/goleveldb/leveldb/iterator"
"github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/opt"
"fmt"
gometrics "github.com/rcrowley/go-metrics" gometrics "github.com/rcrowley/go-metrics"
) )
@ -39,15 +40,17 @@ type LDBDatabase struct {
fn string // filename for reporting fn string // filename for reporting
db *leveldb.DB // LevelDB instance db *leveldb.DB // LevelDB instance
getTimer gometrics.Timer // Timer for measuring the database get request counts and latencies getTimer gometrics.Timer // Timer for measuring the database get request counts and latencies
putTimer gometrics.Timer // Timer for measuring the database put request counts and latencies putTimer gometrics.Timer // Timer for measuring the database put request counts and latencies
delTimer gometrics.Timer // Timer for measuring the database delete request counts and latencies delTimer gometrics.Timer // Timer for measuring the database delete request counts and latencies
missMeter gometrics.Meter // Meter for measuring the missed database get requests writeDelayTimer gometrics.Timer // Timer for measuring the write delay duration due to database compaction
readMeter gometrics.Meter // Meter for measuring the database get request data usage missMeter gometrics.Meter // Meter for measuring the missed database get requests
writeMeter gometrics.Meter // Meter for measuring the database put request data usage readMeter gometrics.Meter // Meter for measuring the database get request data usage
compTimeMeter gometrics.Meter // Meter for measuring the total time spent in database compaction writeMeter gometrics.Meter // Meter for measuring the database put request data usage
compReadMeter gometrics.Meter // Meter for measuring the data read during compaction writeDelayMeter gometrics.Meter // Meter for measuring the write delay number due to database compaction
compWriteMeter gometrics.Meter // Meter for measuring the data written during compaction compTimeMeter gometrics.Meter // Meter for measuring the total time spent in database compaction
compReadMeter gometrics.Meter // Meter for measuring the data read during compaction
compWriteMeter gometrics.Meter // Meter for measuring the data written during compaction
quitLock sync.Mutex // Mutex protecting the quit channel access quitLock sync.Mutex // Mutex protecting the quit channel access
quitChan chan chan error // Quit channel to stop the metrics collection before closing the database quitChan chan chan error // Quit channel to stop the metrics collection before closing the database
@ -186,6 +189,9 @@ func (db *LDBDatabase) Meter(prefix string) {
db.missMeter = metrics.NewMeter(prefix + "user/misses") db.missMeter = metrics.NewMeter(prefix + "user/misses")
db.readMeter = metrics.NewMeter(prefix + "user/reads") db.readMeter = metrics.NewMeter(prefix + "user/reads")
db.writeMeter = metrics.NewMeter(prefix + "user/writes") db.writeMeter = metrics.NewMeter(prefix + "user/writes")
db.writeDelayTimer = metrics.NewTimer(prefix + "compact/writedelay/duration")
db.writeDelayMeter = metrics.NewMeter(prefix + "compact/writedelay/counter")
db.compTimeMeter = metrics.NewMeter(prefix + "compact/time") db.compTimeMeter = metrics.NewMeter(prefix + "compact/time")
db.compReadMeter = metrics.NewMeter(prefix + "compact/input") db.compReadMeter = metrics.NewMeter(prefix + "compact/input")
db.compWriteMeter = metrics.NewMeter(prefix + "compact/output") db.compWriteMeter = metrics.NewMeter(prefix + "compact/output")
@ -213,7 +219,7 @@ func (db *LDBDatabase) meter(refresh time.Duration) {
// Create the counters to store current and previous values // Create the counters to store current and previous values
counters := make([][]float64, 2) counters := make([][]float64, 2)
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
counters[i] = make([]float64, 3) counters[i] = make([]float64, 5)
} }
// Iterate ad infinitum and collect the stats // Iterate ad infinitum and collect the stats
for i := 1; ; i++ { for i := 1; ; i++ {
@ -262,6 +268,23 @@ func (db *LDBDatabase) meter(refresh time.Duration) {
if db.compWriteMeter != nil { if db.compWriteMeter != nil {
db.compWriteMeter.Mark(int64((counters[i%2][2] - counters[(i-1)%2][2]) * 1024 * 1024)) db.compWriteMeter.Mark(int64((counters[i%2][2] - counters[(i-1)%2][2]) * 1024 * 1024))
} }
// Stat write delay.
writeDelay, err := db.db.GetProperty("leveldb.writedelay")
if err != nil {
db.log.Error("Failed to read database write delay statistic", "err", err)
return
}
if n, err := fmt.Sscanf(writeDelay, "DelayN: %f Delay(sec):%.5f", &counters[i%2][3], &counters[i%2][4]); n != 2 || err != nil {
db.log.Error("Write delay statistic not found")
return
}
if db.writeDelayTimer != nil {
db.writeDelayTimer.Update(time.Duration(int64((counters[i%2][4] - counters[(i-1)%2][4]) * 1000 * 1000 * 1000)))
}
if db.writeDelayMeter != nil {
db.writeDelayMeter.Mark(int64((counters[i%2][3] - counters[(i-1)%2][3])))
}
// Sleep a bit, then repeat the stats collection // Sleep a bit, then repeat the stats collection
select { select {
case errc := <-db.quitChan: case errc := <-db.quitChan: