Некоторые сетевые программы недавно (проблема не существовала пару недель назад) начали зависать для меня. Некоторые проблемы, с которыми я сталкивался, - это mysql, ssh, rsync и git. Моей первой мыслью была проблема с сетевым подключением, но пинг рассматриваемых хостов (веб-сервер и сервер MySQL, размещенный на godaddy.com) показал, что они живы. (Я использовал доменное имя с пингом в обоих случаях.) В какой-то момент я попытался использовать IP-адрес хостов напрямую, и обе программы работали, как ожидалось.

Я не пробовал подключать эти программы к другим хостам.

Я сделал страйк на MySQL, чтобы увидеть, где он висит, и вот хвост этого вывода:

stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=192, ...}) = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\201\226\1\0\0\1\0\0\0\0\0\0\16mendelssohnalb\2db\0073"..., 62, MSG_NOSIGNAL, NULL, 0) = 62
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [78])                = 0
recvfrom(3, "\201\226\201\200\0\1\0\1\0\0\0\0\16mendelssohnalb\2db\0073"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 78
close(3)                                = 0
open("/etc/gai.conf", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3343, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=3343, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8a686a000
read(3, "# Configuration for getaddrinfo("..., 4096) = 3343
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7fe8a686a000, 4096)            = 0
futex(0x7fe8a5ad14a0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
socket(PF_NETLINK, SOCK_RAW, 0)         = 3
bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=2640, groups=00000000}, [12]) = 0
sendto(3, "\24\0\0\0\26\0\1\3\255\241WS\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\255\241WSP\n\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 108
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\255\241WSP\n\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 128
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\255\241WSP\n\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
close(3)                                = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(3306), inet_pton(AF_INET6, "::ffff:67.215.65.145", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(38834), inet_pton(AF_INET6, "::ffff:192.168.0.104", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
connect(3, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("97.74.31.26")}, 16) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(56707), inet_pton(AF_INET6, "::ffff:192.168.0.104", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
close(3)                                = 0
socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(3306), inet_pton(AF_INET6, "::ffff:67.215.65.145", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = ? ERESTARTSYS (To be restarted)
--- SIGINT (Interrupt) @ 0 (0) ---
+++ killed by SIGINT +++

Отсюда это выглядит как проблема getaddrinfo(3). Похоже, он пытается подключиться с использованием IPv6, но я ничего не сделал для настройки IPv6, и я почти уверен, что мне придется что-то настраивать на самом конце, чтобы использовать IPv6 для подключения к этим хостам.

Моя система - это система Xubuntu 12.04 LTS, где я принимаю нормальные обновления. Мой /var/logs/apt/history.log показывает обновления за последние 2 недели для openssh-client, openssl и libssl1. Есть и другие, но они единственные, которые выглядят актуально для меня.

Uname отчеты:

Linux Popwease 3.2.0-60-generic #91-Ubuntu SMP Wed Feb 19 03:54:44 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Я вчера гуглял и искал страницы с очень небольшим пониманием того, что происходит.


24 апреля 2014

Некоторая дополнительная информация. Больше свидетельств о проблеме с getaddrinfo. Я узнал, что host и dig используют более раннее gethostbyname, но «getent hosts ---» использует getaddrinfo. Это объясняет, почему я мог получить IP-адрес от имени с помощью хоста.

Вот что я получаю, когда использую getent:

ccc@Popwease:~$ getent hosts amazon.com
::ffff:67.215.65.145 amazon.com.nycap.rr.com
ccc@Popwease:~$ getent hosts amazon.com.
176.32.98.166   amazon.com
205.251.242.54  amazon.com
72.21.194.212   amazon.com
72.21.215.232   amazon.com
ccc@Popwease:~$ getent hosts gutenberg.org
::ffff:67.215.65.145 gutenberg.org.nycap.rr.com
ccc@Popwease:~$ getent hosts gutenberg.org.
152.19.134.47   gutenberg.org
ccc@Popwease:~$ getent hosts www.gutenberg.org
152.19.134.47   gutenberg.org www.gutenberg.org
ccc@Popwease:~$ getent hosts www.amazon.com
::ffff:67.215.65.145 www.amazon.com.nycap.rr.com

Обратите внимание, что «.nycap.rr.com» является доменом моего интернет-провайдера. Так что, если я не поставлю окончательный '.'в доменном имени getent возвращает поддельный IPv6-адрес. Но www.gutenberg.org кажется исключением. Хорошо, amazon.com - это домен, и вы используете хост по умолчанию для DNS. Но последний пример, кажется, омрачает эту теорию.

Веб-хостинг, к которому я пытался добраться, изначально использует дефолтный хост для домена, но имеет «www». Когда я либо ставлю окончательную точку на имени, либо указываю полное имя, я больше не замечаю соответствующие программы. Мне показалось, что сервер Godaddy DB - это полное имя, но для этого нужно заключительное '.' также на работу.

2 ответа2

0

У меня была похожая проблема. Мой сервер CentOS 5.5 OpenVZ (2.6.18-238.5.1.el5.028stab085.5) зависал бы на многих программах, таких как ssh или даже sudo, и все они остановились на том, что похоже на сетевой вызов:

socket(PF_NETLINK, SOCK_RAW, 0)         = 5
bind(5, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(5, {sa_family=AF_NETLINK, pid=115051, groups=00000000}, [1443221608318631948]) = 0
sendto(5, "\24\0\0\0\22\0\1\3\0345vS\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20

Я не мог даже перезапустить сетевые сервисы. Потребовалась перезагрузка, чтобы вернуть его в нормальное состояние ... кто-нибудь понимает, что является удаленным концом этого сокета?

0

Я отвечаю на это примерно через 1 час после того, как я сделал последнее изменение в исходном сообщении. Без каких-либо изменений в моей системе, getent начал работать правильно, а также программы, которые первоначально предложили этот пост.

Я должен заключить, что проблема была ошибкой на сервере DNS в roadrunner, которая только что была исправлена.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .