我有一个运行的rails应用程序,它使用redis很多 - 但是 - 我Redis::TimeoutError不时会看到不少发生在这里和那里.在这种情况下没有模式.它既出现在Web应用程序中,也出现在后台作业中(使用sidekiq进行处理) - 不经常但偶尔会出现.
现在我不知道如何找出这个的根本原因,因此不知道如何解决它.
以下是我的设置的一些背景知识:
redis实例运行在单独的物理服务器上,该服务器连接到私有本地1Gbit网络中的Web服务器和后台服务器.所有服务器都运行ubuntu 12.04.redis版本是2.6.10.我使用像这样的初始化程序从我的rails应用程序(3.2)连接:
require 'redis'
require 'redis/objects'
REDIS = Redis.new(:url => APP_CONFIG['REDIS_URL'])
Redis.current = REDIS
Run Code Online (Sandbox Code Playgroud)
这是输出redis-cli INFO:
# Server
redis_version:2.6.10
redis_git_sha1:00000000
redis_git_dirty:0
redis_mode:standalone
os:Linux 3.2.0-38-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.6.3
process_id:28475
run_id:d89bbb1b81d3169c4228cf23c0988ae437d496a1
tcp_port:6379
uptime_in_seconds:14913365
uptime_in_days:172
lru_clock:1507056
# Clients
connected_clients:233
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:19
# Memory
used_memory:801637360
used_memory_human:764.50M
used_memory_rss:594706432
used_memory_peak:4295394784
used_memory_peak_human:4.00G
used_memory_lua:31744
mem_fragmentation_ratio:0.74
mem_allocator:jemalloc-3.3.0
# Persistence
loading:0
rdb_changes_since_last_save:23166
rdb_bgsave_in_progress:0
rdb_last_save_time:1378219310
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:4
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1 …Run Code Online (Sandbox Code Playgroud) 我有一个运行memcached的专用128GB ram服务器.4个Web服务器连接到那个.它们总共发送大约20k包/秒.
最近我决定改变从web服务器到memcached服务器的连接,从持久的SSH隧道到使用Tinc(为了简化设置和灵活性,只要我需要它们在新端口上进行通信).
这种变化导致网络往返的开销显着增加(见图表).然而,我注意到,使用Tinc支持SSH隧道的网络开销要小得多(甚至比之前的SSH隧道还要快!),当我用它在服务器之间进行通信时(例如我的Postgresql数据库服务器),吞吐量低很多<每秒10k数据包.我试图在更多服务器之间分配memcached负载,突然来自tinc/network的开销显着下降.
现在,我不明白为什么tinc网络开销会随着吞吐量的增加而急剧增加?这就像我打了一个瓶颈(并且它肯定不是CPU,因为Newrelic报告<tinc过程的使用率<0.5%).有什么东西我可以在Tinc设置中调整,还是Tinc只是高吞吐量的坏选择?我应该使用IPsec吗?
我有一个转储,其中数据和结构位于公共模式中。我想将其恢复到具有自定义名称的架构中 - 我该怎么做?
编辑V 2:
我的转储文件来自heroku,开头如下所示:
PGDMP
!
pd6rq1i7f3kcath9.1.59.1.6<Y
0ENCODINENCODINGSET client_encoding = 'UTF8';
falseZ
00
STDSTRINGS
STDSTRINGS)SET standard_conforming_strings = 'off';
false[
126216385d6rq1i7f3kcatDATABASE?CREATE DATABASE d6rq1i7f3kcath WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
DROP DATABASE d6rq1i7f3kcath;
uc0lt9t3fj0da4false26152200publicSCHEMACREATE SCHEMA public;
DROP SCHEMA public;
postgresfalse\
SCHEMA publicCOMMENT6COMMENT ON SCHEMA public IS 'standard public schema';
postgresfalse5?307916392plpgsql EXTENSION?CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
DROP EXTENSION plpgsql;
false]
00EXTENSION plpgsqlCOMMENT@COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
false212?125516397_final_mode(anyarrayFUNCTION?CREATE …Run Code Online (Sandbox Code Playgroud) 我有一个巨大的配置yaml文件,其中所有节点都应该作为字符串读取.一个例子:
model_names:
Audi:
A4:
- A4
- A 4
Fiat:
500:
- 500
Run Code Online (Sandbox Code Playgroud)
我在rails中加载文件:
catalogue = File.read("#{Rails.root}/config/cars_catalogue.yml")
CARS_CATALOGUE = YAML.load(catalogue)
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我要求:
CARS_CATALOGUE['model_names']['Fiat']['500']
Run Code Online (Sandbox Code Playgroud)
它返回nil,因为它认为500:是一个fixnum - 但是所有节点都应该总是字符串 - 而且我不想在yaml文件中的所有地方使用引号强制执行此操作.那么我该如何以简单明智的方式做到这一点呢?
我在rails 3.2上,我的生产设置是使用nginx和unicorn.
我有一些资产,一个名为sidekiq的红宝石宝石使用.但是,当我提出要求时,这些资产没有得到妥善处理.我的nginx配置看起来像这样:
upstream unicorn {
server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}
server {
listen 80 default deferred;
# server_name example.com;
root /home/deployer/apps/myapp/current/public;
if (-f $document_root/system/maintenance.html) {
return 503;my
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /system/maintenance.html last;
break;
}
location ~ ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10; …Run Code Online (Sandbox Code Playgroud) 我一直在使用具有此功能的 Postgres(版本 9.2 和 9.3):https : //wiki.postgresql.org/wiki/Aggregate_Mode一段时间。现在最近升级到版本 9.4 后,我在使用该功能时遇到以下错误:
Run Code Online (Sandbox Code Playgroud)PG::WrongObjectType: ERROR: WITHIN GROUP is required for ordered-set aggregate mode LINE 1: SELECT mode(logins_count) AS mode_value FROM "registrations" WHERE "registrations"."cr...
执行以下操作时发生错误:
SELECT mode(logins_count) AS mode_value FROM registrations
WHERE registrations.created_at > '20141105';
Run Code Online (Sandbox Code Playgroud)
我不明白错误信息,我没有得到我必须改变的东西?
有点背景:我使用的是Rails 3.0.7,Postgres 9.0和MetaWhere/MetaSearch 1.0.4
在查询我的数据库时获取唯一记录时遇到了一个非常令人沮丧的问题.我有3个型号如下:
class Car < ActiveRecord::Base
has_many :sellers, :through => :adverts, :uniq => true
has_many :adverts, :dependent => :destroy
end
class Seller < ActiveRecord::Base
has_many :cars, :through => :adverts, :uniq => true
has_many :adverts
end
class Advert < ActiveRecord::Base
belongs_to :car, :autosave => false
belongs_to :seller, :autosave => false
end
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我要做的是,找到所有的汽车,就是菲亚特熊猫(:品牌,汽车上的model_name属性).这很好.但是,如果我想从卖家表中加入一些信息,那么问题就开始显现 - 我正在获得重复的汽车!我所做的是以下内容:
Car.includes(:adverts, :sellers).where(:brand >> 'Fiat', :model_name >> 'Panda', :sellers => [:kind >> 'Dealer'])
Run Code Online (Sandbox Code Playgroud)
现在你可以争辩说,这是不可能的,因为"数据库应该如何知道哪种:从所有连接到每辆车的卖家中选择哪种?" 但是我不在乎,因为它们都是一样的,所以如果它是第一个或者它是最后一个卖家它是否具有属性值并不重要.如果我执行.debug_sql,我会得到以下内容:
SELECT cars.*, sellers.*, adverts.* FROM cars LEFT OUTER JOIN adverts …Run Code Online (Sandbox Code Playgroud) 背景: 我有一张叫做汽车的桌子,里面装着很多二手车,约100万行.该表有170多列.该表仅针对各列进行索引.大多数列都是布尔值(例如has_automatic_gearbox等),其余的是字符串和数字(例如颜色和价格).这些车在一个视图中显示,我在170个中使用了大约80列.
我的问题: 所以我的问题是,它是否会对性能产生影响,是否在搜索时只选择表格中的80列,或者另一方面我创建了一个仅包含80列的新表格我需要,而不是总共170列?换句话说,它是否会对性能产生影响,表是否包含未被选中的列?
嗨,我在Heroku上运行postgresql 9.1.6,他们的Ika计划(7,5gb ram).我有一张叫做汽车的桌子.我需要做以下事情:
SELECT COUNT(*) FROM "cars" WHERE "cars"."reference_id" = 'toyota_hilux'
Run Code Online (Sandbox Code Playgroud)
现在这需要花费大量的时间(64秒!!!)
Aggregate (cost=2849.52..2849.52 rows=1 width=0) (actual time=63388.390..63388.391 rows=1 loops=1)
-> Bitmap Heap Scan on cars (cost=24.76..2848.78 rows=1464 width=0) (actual time=1169.581..63387.361 rows=739 loops=1)
Recheck Cond: ((reference_id)::text = 'toyota_hilux'::text)
-> Bitmap Index Scan on index_cars_on_reference_id (cost=0.00..24.69 rows=1464 width=0) (actual time=547.530..547.530 rows=832 loops=1)
Index Cond: ((reference_id)::text = 'toyota_hilux'::text)
Total runtime: 64112.412 ms
Run Code Online (Sandbox Code Playgroud)
一点背景:
该表包含大约3.2米的行,而我正在尝试依赖的列具有以下设置:
reference_id character varying(50);
Run Code Online (Sandbox Code Playgroud)
和索引:
CREATE INDEX index_cars_on_reference_id
ON cars
USING btree
(reference_id COLLATE pg_catalog."default" );
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我希望这种表现不是我应该期待的 - 或者我应该这样做?
我打算将一个很大的PostgreSQL集群从9.3升级到11。
升级
该集群的大小约为1,2Tb。该数据库具有一个磁盘系统,该磁盘系统由8个具有192GB内存和64个内核的DC版本SSD的快速HW RAID 10阵列组成。我通过先将数据复制到具有流复制的新服务器来执行升级,然后将其升级到11。
我使用pg_upgrade该--link选项测试了升级,这花费了不到一分钟的时间。我还定期(没有--link)对许多工作进行了升级测试,这需要几个小时(+4)。
问题
现在,显而易见的选择让我使用了该--link选项,但是,所有这些使我感到奇怪-与常规的较慢方法相比,使用该选项是否有任何不利之处(在性能或功能方面)?我不知道postgresql数据结构的内部工作原理,但是我觉得升级后完全重写数据和仅使用数据之间可能会有性能差异hard links-意味着什么?
注意事项
我可以大概的缺点的文档中找到的唯一的事情--link就是升级完成之后不能够访问旧数据目录的缺点https://www.postgresql.org/docs/11/pgupgrade.htm但是,这种只是出于安全考虑,而不是性能缺陷,并且在我首先复制数据的情况下并没有真正应用。我能想到的唯一的另一件事就是回收空间,无论性能如何。但是,据我了解,还可以通过在升级升级的数据库之后运行VACUUM FULL DATABASE(或CLUSTER?)命令来实现--link?另外,据我了解,回收空间对SSD的性能并不是很重要。
我很高兴有人能对此有所帮助。
postgresql ×6
performance ×2
ruby ×2
assets ×1
heroku ×1
ipsec ×1
meta-search ×1
meta-where ×1
nginx ×1
pg-upgrade ×1
redis ×1
sql ×1
ssh ×1
ssh-tunnel ×1
tinc ×1
unicorn ×1
yaml ×1