psycopg2 зависает, когда оператор «SELECT» выполняется против information_schema в CentOS против python 2.6

#python #sql #linux #postgresql #centos

#python #sql #linux #postgresql #centos

Вопрос:

У меня есть скрипт на python, который выполняет запрос к базе данных postgresql (RedShift. Он отлично работает на моем локальном компьютере:

 Ubuntu 12.10,
python 2.7
psycog.__version__ = '2.5.3 (dt dec pq3 ext)'
 

Но он зависает, когда я выполняю НЕКОТОРЫЕ запросы с моей рабочей машины на AWS

 CentOS 6.5
Python 2.6
psycog.__version__ = '2.5.3 (dt dec pq3 ext)'
 

Вот код:

 import psycopg2
con = psycopg2.connect(**{<my_connection_params>}})
curs = con.cursor()

# This works perfectly fine on both machines !!!
curs.execute("""SELECT table_name FROM information_schema.tables
              WHERE table_schema='public' AND table_type='BASE TABLE'""")

# This one hangs on AWS, but works fine from my laptop
curs.execute('select column_name from information_schema.columns')
 

Когда я подключаюсь db и запускаю запрос, чтобы увидеть запущенные процессы, я вижу это:

 select pid, trim(user_name), starttime, substring(query,1,20)
from stv_recents
where status='Running';
 

Я вижу этот запрос.

вот strace -p :

 ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x3aaa00f710}, {0x3ab1027010, [], SA_RESTORER|SA_RESTART, 0x3aaa00f710}, 8) = 0
gettimeofday({1403280035, 826010}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, [PIPE], [], 8) = 0
write(3, "2731 5351Br$331300563v211f325367210331331253300310240"..., 122) = 122
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
poll([{fd=3, events=POLLIN|POLLERR}], 1, -1) =
 

Комментарии:

1. pg_stat_activity На стороне сервера есть waiting флаг для запроса? Если это так, проверьте pg_locks и посмотрите, заблокирована ли у кого-нибудь таблица для DDL.

Ответ №1:

Оказывается, что :

Экземпляры Amazon EC2-Classic могут обрабатывать до 1500 байт данных за кадр, в то время как экземпляры Amazon EC2-VPC могут обрабатывать до 9000 байт данных за кадр. В смешанной среде мы рекомендуем отключить большие фреймы TCP / IP, установив MTU равным 1500 в экземпляре Amazon EC2-VPC; таким образом, оба экземпляра используют максимум 1500 байт. Это не обязательно, если и экземпляры клиента, и кластера используют Amazon EC2-VPC.

http://docs.aws.amazon.com/redshift/latest/mgmt/connecting-drop-issues.html

ИТАК, эта строка решит проблему:

 ip link set dev eth0 mtu 1500