无法通过 python (Socket) 在一分钟内将大指标 (500+) 推送到 Graphite

Unable to push large metrics (500+) within a min to graphite via python (Socket)

我有 5 个 MySQL 个从机和 1 个主机,我正在为每台机器收集统计数据并使用 python 程序推送到 Graphite。该脚本运行 6 个线程(对于每台机器)并通过套接字发送到石墨。我很清楚,我无法一次推送超过 70 个统计数据。这是程序。

ThreadSocketClient.py

from threading import Thread, current_thread
import socket
import MySQLdb as Database
import logging
import sys
import time
from mysqlStats import status_keys
from mysqlStats import GRAPHITE_HOST, GRAPHITE_PORT

class MysqlGraphiteUtil(Thread):

def __init__(self,host,port,user,password):
    Thread.__init__(self)
    print current_thread
    self.host=host
    self.port=port
    self.user=user
    self.password=password
    self.sock = socket.socket()
    self.sock.connect((GRAPHITE_HOST, GRAPHITE_PORT))

def run(self):
    self.connectDB()
    self.showStatus()
    self.sock.close()

def connectDB(self):
    try:
        self.db = Database.connect(
            host=self.host,
            port=self.port,
            user=self.user,
            passwd=self.password
        )
    except Exception, err:
        logging.exception(err)
        print err
        sys.exit()

    return self.db,self.host

def showStatus(self):
    self.cursor = self.db.cursor()
    self.cursor.execute("SHOW GLOBAL STATUS")
    data = self.cursor.fetchall()
    self.stats = dict()
    for key, value in data:
        if key in status_keys:
            self.stats[key] = value
    self.db.close()
    self.push_data(self.stats, self.host)

def push_data(self,stats, sname):
    for key, val in stats.iteritems():
        if val.isdigit():
            short = sname.replace('.', '_')
            message = 'mysql.' + short + '.' + key + ' ' + val + ' ' + '%d \n' % int(time.time())
            self.sock.send(message)
            self.sock.close()

问题出在 push_data(),当我将 time.sleep(0.30) 放在 self.sock.close() 之后时,它正在发送所有数据,但需要一分多钟(大约 2 分钟)。这是没有用的,因为我正在收集每分钟的指标。请帮助我如何加速套接字连接和发送。

PS:如果支持文件需要任何详细信息,请告诉我,我会post。

我用 tcpdump 验证了服务器是否正在消耗我发送的所有 packets/data。它按预期进行。所以,确认 socket 不是问题。

接下来的检查,我想完全验证carbon.conf,发现MAX_QUEUE_SIZE是500,增加到1000,但发送总数和接收总数仍然存在差异。

还发现 MAX_CREATES_PER_MINUTE=100,我把它改成了 1000,成功了!!这是指示石墨创建最大编号的值。每分钟耳语文件数。