Golang implementation of Graphite/Carbon server with classic architecture: Agent -> Cache -> Persister
used by Doo 1M metric/sec (12 CPU)
Encore une discussion intéressante sur les perf de graphite. Ce qu'il faut retenir c'est que le botteneck peut se situer au niveau du CPU ou au niveau du disque (la RAM en général ce n'est pas un probleme, meme si bien sur, il faut la surveiller)
Pour connaitre l'utilisation du CPU de carbon-cache, une metric est envoyé par le daemon dans carbon.agents.graphite-x.cpuUsage
Pour connaitre l'utilisation du disk, on se sert de iostat -dmx 1 2 (merci arnaud)
Si le disque est trop haut (entre 50 et 75), il faut le soulager en baissant dans la conf de carbon le max update par seconde.
Ce qui aura pour effet d'augmenter la taille du cache et donc de faire plus travailler le CPU..
Au contraire si le CPU est chargé mais que le disque ne fait rien, il faut augmenter le max update par seconde.
En trouvant le bon équilibre on peut exploiter au maximum le hardware disponible
#
#
#source /lib/lsb/init-functions
. /lib/lsb/init-functions
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GRAPHITE_HOME=/opt/graphite
NAME=carbon-cache
DESC=carbon-cache
#Carbon has its own logging facility, by default in /opt/graphite/storage/log/carbon-cache-*
DAEMON=$GRAPHITE_HOME/bin/carbon-cache.py
PIDFILE=/opt/graphite/storage/carbon-cache-a.pid
SCRIPTNAME=/etc/init.d/$NAME
if [ ! -x "$DAEMON" ]; then {
echo "Couldn't find $DAEMON or not executable"
exit 99
}
fi
[ -f /etc/default/rcS ] && . /etc/default/rcS
#
#
do_start()
{
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
# Test to see if the daemon is already running - return 1 if it is.
start-stop-daemon --start --pidfile $PIDFILE \
--exec $DAEMON --test -- start > /dev/null || return 1
# Start the daemon for real, return 2 if failed
start-stop-daemon --start --pidfile $PIDFILE \
--exec $DAEMON -- start > /dev/null || return 2
}
#
#
do_stop() {
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
log_daemon_msg "Stopping $DESC" "$NAME"
start-stop-daemon --stop --signal 2 --retry 5 --quiet --pidfile $PIDFILE
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Delete the exisitng PID file
if [ -e "$PIDFILE" ]; then {
rm $PIDFILE
}
fi
return "$RETVAL"
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
restart)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
) log_end_msg 1 ;; # Failed to start
esac
;;
)
log_end_msg 1
;;
esac ;; status) if [ -s $PIDFILE ]; then pid= cat $PIDFILE kill -0 $pid >/dev/null 2>&1 if [ "$?" = "0" ]; then echo "$NAME is running: pid $pid." RETVAL=0 else echo "Couldn't find pid $pid for $NAME." RETVAL=1 fi else echo "$NAME is stopped (no pid file)." RETVAL=1 fi ;; *) echo "Usage: $SCRIPTNAME {start |
stop | restart | status}" >&2 exit 3 ;; esac |
---|
Suite d'outils bien pratique pour tester/vérifier/debug ses whisper files, en particulier whisper-dump et whisper-fetch
Je me mets ça de côté : la retention par défaut des RRD dans munin au format carbon :
[munin_schema]
pattern = ^munin.
retentions = 5m:2d,30m:10d,2h:45d,1d:1y
Sur les 2 derniers jours on a une mesure toute les 5 minutes
Sur les 10 derniers jours, une mesure toute les 30 minute est conservée
etc
/opt/graphite/conf/storage-schemas.conf