mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 01:13:45 +00:00
ethdb: add write delay meters
This commit is contained in:
parent
a30dc0ce7c
commit
61920f6600
1 changed files with 33 additions and 10 deletions
|
|
@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -42,9 +43,11 @@ type LDBDatabase struct {
|
||||||
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
|
||||||
|
writeDelayTimer gometrics.Timer // Timer for measuring the write delay duration due to database compaction
|
||||||
missMeter gometrics.Meter // Meter for measuring the missed database get requests
|
missMeter gometrics.Meter // Meter for measuring the missed database get requests
|
||||||
readMeter gometrics.Meter // Meter for measuring the database get request data usage
|
readMeter gometrics.Meter // Meter for measuring the database get request data usage
|
||||||
writeMeter gometrics.Meter // Meter for measuring the database put request data usage
|
writeMeter gometrics.Meter // Meter for measuring the database put request data usage
|
||||||
|
writeDelayMeter gometrics.Meter // Meter for measuring the write delay number due to database compaction
|
||||||
compTimeMeter gometrics.Meter // Meter for measuring the total time spent in database 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
|
compReadMeter gometrics.Meter // Meter for measuring the data read during compaction
|
||||||
compWriteMeter gometrics.Meter // Meter for measuring the data written during compaction
|
compWriteMeter gometrics.Meter // Meter for measuring the data written during compaction
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue