- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个应用程序每秒对 redis 进行大约 400 次读取和每秒 100 次写入(托管在 redislabs 上)。该应用程序使用 github.com/garyburd/redigo
包作为 redis 代理。
我有两个函数,它们是唯一用于读写的函数:
func getCachedVPAIDConfig(key string) chan *cachedVPAIDConfig {
c := make(chan *cachedVPAIDConfig)
go func() {
p := pool.Get()
defer p.Close()
switch p.Err() {
case nil:
item, err := redis.Bytes(p.Do("GET", key))
if err != nil {
c <- &cachedVPAIDConfig{nil, err}
return
}
c <- &cachedVPAIDConfig{item, nil}
default:
c <- &cachedVPAIDConfig{nil, p.Err()}
return
}
}()
return c
}
func setCachedVPAIDConfig(key string, j []byte) chan error {
c := make(chan error)
go func() {
p := pool.Get()
defer p.Close()
switch p.Err() {
case nil:
_, err := p.Do("SET", key, j)
if err != nil {
c <- err
return
}
c <- nil
default:
c <- p.Err()
return
}
}()
return c
}
如您所见,我正在使用推荐的连接池机制 ( http://godoc.org/github.com/garyburd/redigo/redis#Pool )。
我在应用程序端点收到的每个 http 请求上调用这些函数。问题是:一旦应用程序开始接收请求,它就会立即开始抛出错误
dial tcp 54.160.xxx.xx:yyyy: connect: cannot assign requested address
(54.160.xxx.xx:yyyy是redis主机)
我在 redis 上看到当这种情况开始发生时只有大约 600 个连接,这听起来并不多。
我尝试使用 pool
的 MaxActive
设置,将其设置在 1000 到 50K 之间的任何位置,但结果是一样的。
有什么想法吗?
编辑
这是我的池初始化代码(在 func init
中执行此操作):
pool = redis.Pool{
MaxActive: 1000, // note: I tried changing this to 50K, result the same
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", redisHost)
if err != nil {
return nil, err
}
if _, err := c.Do("AUTH", redisPassword); err != nil {
c.Close()
return nil, err
}
return c, err
},
}
编辑 2:通过应用以下答案中建议的内容解决了问题!
池初始化的新代码:
pool = redis.Pool{
MaxActive: 500,
MaxIdle: 500,
IdleTimeout: 5 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.DialTimeout("tcp", redisHost, 100*time.Millisecond, 100*time.Millisecond, 100*time.Millisecond)
if err != nil {
return nil, err
}
if _, err := c.Do("AUTH", redisPassword); err != nil {
c.Close()
return nil, err
}
return c, err
},
}
这个新的 init 使得 get 和 set 超时由 redigo 内部处理,所以我不再需要在 getCachedVPAIDConfig 和 setCachedVPAIDConfig 函数上返回一个 channel 。这是他们现在的样子:
func setCachedVPAIDConfig(key string, j []byte) error {
p := pool.Get()
switch p.Err() {
case nil:
_, err := p.Do("SET", key, j)
p.Close()
return err
default:
p.Close()
return p.Err()
}
}
func getCachedVPAIDConfig(key string) ([]byte, error) {
p := pool.Get()
switch p.Err() {
case nil:
item, err := redis.Bytes(p.Do("GET", key))
p.Close()
return item, err
default:
p.Close()
return nil, p.Err()
}
}
最佳答案
您在 channel 上发送后关闭连接,如果 channel 阻塞您没有关闭连接,这将导致您看到的错误。所以不要只是推迟,明确关闭连接。
我认为这不是问题,但无论如何都是一个好主意 - 使用 DialTimeout
为您的连接设置超时。
确保您有适当的 TestOnBorrow
函数来消除死连接,尤其是在您有超时的情况下。如果连接空闲时间超过 3 秒,我通常会执行 PING(该函数接收空闲时间作为参数)
也尝试将 MaxIdle
设置为一个更大的数字,我记得有一个池化问题是通过增加池中的该参数解决的。
关于go - 重新设计 : getting dial tcp: connect: cannot assign requested address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37828284/
无法运行结构第一个网络示例 这是我运行时的日志:./byfn up / ___| |_ _| / \ | _ \ |_ _| \___ \ | | / _ \
AWS kubernetes集群中的所有节点(服务器版本:version.Info {主要:“1”,次要:“0”,GitVersion:“v1.0.6”,GitCommit:“388061f00f0d
我有一个包含三个节点的 kubernetes 集群:10.9.84.149、10.9.105.90 和 10.9.84.149。当我的应用程序尝试在某个 pod 内执行命令时: kuebctl exe
任何人都可以帮助我修复以下错误。我正在尝试通过cli在对等节点上安装chaincode。我正确配置了cli容器。但是不知何故我收到此错误。 grpc: addrConn.createTransport
I am writing a simple Go web application with Redis (trying out redis for the first time) on Wind
我们已经在 Azure 公共(public)云中使用 ACS 引擎部署了 K8S 集群。我们能够创建部署和服务,但是当我们使用“kubectl exec -ti (pod name) (command
我们有客户要求为宽带用户提供拨号的“精简”版本和所有花里胡哨的功能。 该解决方案将使用 Flex/Flash/Java EJB 和一些 jsp。 Web服务器有没有办法区分两者? 最佳答案 你不关心用
我有三个分机号,分机号。 2000 , 2001 , 2002 .另外,我可以从一个分机调用另一个分机。在调用任何扩展时,它会出现这样的错误 Asterisk 中的扩展错误没有应用程序“拨号” 我的
是否可以通过他们的拨号调制解调器在同一国家/地区的计算机 A 与计算机 B 通话?我的意思是将计算机用作电话(使用拨号调制解调器)我不需要转移语音只是:1)电脑A拨电脑B(有电话号码)2)计算机B看到
如何在等待连接成功的同时调用号码并向来电者播放音乐? 下面的代码在执行 (这是逻辑)之前等待音乐结束 http://com.twilio.music.ambient.s3.amazonaw
我正在 GitHub 上开发一个 IDE 的分支,主要问题之一是它将文件保存到 cookie,而不是普通计算机。因此,我需要一种保存和打开文件的方法。我已经使用 blob 关闭了保存文件系统。然而,根
我正在开发一个小型 AMQP 消费者,我想测试我的消费者代码,但我很难模拟 amqp.Dial。我添加了一些接口(interface)以便我可以模拟 Connection 和 Channel 并添加了
我有一个应用程序,可以让用户调用他们想要添加到通话中的号码。每个用户都受其帐户中余额的影响。 拨号是使用 TwiML 执行的 因此,根据我每分钟的金额,我以秒为单位计算剩余余额,并将其设置为 tim
我正在开发一个小型 AMQP 消费者,我想测试我的消费者代码,但我很难模拟 amqp.Dial。我添加了一些接口(interface)以便我可以模拟 Connection 和 Channel 并添加了
我正在使用 Twilio Java API,但我似乎无法构建将调用 Sip 分机的响应。 TwiMLResponse twiml = new TwiMLResponse(); Sip sip = ne
我只是想找出为什么会出现这些错误。我不太清楚为什么它说找不到变量或者为什么它不允许我添加或减去一个 int 。 错误如下: javac Dial2.java Dial2.java:
我正在将一个复杂的软件从 IRIX 移植到 Linux Red-Hat。它现在使用 libSgm 中的 Dial 小部件(例如,请参阅 here)。我搜索了很长一段时间,没有找到任何可以在 Linux
刚刚按照 Ubuntu 14.04 中的存储库的官方说明安装了 Docker CE 安装成功,守护进程正在运行 $ ps aux | grep docker [...] /usr/bin/docker
此代码从我的应用程序成功调用 Intent dialer = new Intent("android.intent.action.CALL_PRIVILEGED"); mail.setData(Uri
我需要能够选择应该从哪个 IP 地址发送我的 HTTP 请求。现在在我的代码中,对于 DNS 缓存,我根据 this 使用以下内容: defaultTransport.DialContext = fu
我是一名优秀的程序员,十分优秀!