小编use*_*801的帖子

Golang RESTful API负载测试导致数据库连接过多

我认为我在Golang中管理数据库连接池存在严重问题.我使用Gorilla Web工具包构建了一个RESTful API,当只有少量请求被发送到服务器时,它工作得很好.但是现在我开始使用loader.io站点进行负载测试.我为这篇长篇文章道歉,但我想给你全面的了解.

在进一步讨论之前,以下是运行API和MySQL的服务器的一些信息:专用主机Linux 8GB RAM Go版本1.1.1使用go-sql-driver MySQL 5.1进行数据库连接

使用loader.io我可以发送1000 GET请求/ 15秒没有问题.但是当我发送1000个POST请求/ 15秒时,我会收到很多错误,所有这些错误都是ERROR 1040太多的数据库连接.许多人在网上报道了类似的问题.请注意,我现在只测试一个特定的POST请求.对于这篇帖子请求,我确保了以下内容(许多其他人也在线提出)

  1. 我确保我不使用Open和Close*sql.DB来实现短暂的功能.所以我在连接池中只创建了全局变量,如下面的代码所示,尽管我在这里建议是因为我不喜欢使用全局变量.

  2. 我确保尽可能使用db.Exec,并且只在预期结果时使用db.Query和db.QueryRow.

由于上面没有解决我的问题,我尝试设置db.SetMaxIdleConns(1000),解决了1000个POST请求/ 15秒的问题.意思是不再有1040个错误.然后我将负载增加到2000 POST请求/ 15秒,然后我又开始获得ERROR 1040.我试图增加db.SetMaxIdleConns()中的值,但这没有什么区别.

我通过运行SHOW STATUS WHERE variable_name='Threads_connected'来获取MySQL数据库中连接数的一些连接统计信息;

对于1000个POST请求/ 15秒:观察到#threads_connected~ = 100对于2000个POST请求/ 15秒:观察到#threads_connected~ = 600

我还增加了my.cnf中MySQL的最大连接数,但这并没有什么区别.你有什么建议?代码看起来不错吗?如果是,那么可能连接只是有限的.

您将在下面找到该代码的简化版本.

var db *sql.DB

func main() {
    db = DbConnect()
    db.SetMaxIdleConns(1000)

    http.Handle("/", r)
    err := http.ListenAndServe(fmt.Sprintf("%s:%s", API_HOST, API_PORT), nil)

    if err != nil {
       fmt.Println(err)
    }
}

func DbConnect() *sql.DB {
    db, err := sql.Open("mysql", connectionString)
    if err != nil {
        fmt.Printf("Connection error: %s\n", err.Error())
        return …
Run Code Online (Sandbox Code Playgroud)

mysql sql go gorilla

3
推荐指数
1
解决办法
3489
查看次数

标签 统计

go ×1

gorilla ×1

mysql ×1

sql ×1