LINUX.ORG.RU

i2p сыплет ошибками

 , ,


1

1

Ubuntu 14.04, i2p 0.9.26. Через пару часов после рестарта в /var/log/i2p/log-router-0.txt начинает сыпаться примерно следующее

6/29/16 7:45:42 AM ↓↓↓ 639 similar messages omitted ↓↓↓
6/29/16 7:45:42 AM ERROR [NTCP Pumper ] ter.transport.ntcp.EventPumper: Error accepting
     java.io.IOException: Too many open files
     at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
     at net.i2p.router.transport.ntcp.EventPumper.processAccept(EventPumper.java:528)
     at net.i2p.router.transport.ntcp.EventPumper.processKeys(EventPumper.java:393)
     at net.i2p.router.transport.ntcp.EventPumper.run(EventPumper.java:192)
     at java.lang.Thread.run(Thread.java:745)
     at net.i2p.util.I2PThread.run(I2PThread.java:103)
6/29/16 7:45:42 AM ERROR [P reader 2/4] r.transport.ntcp.NTCPTransport: Error opening a channel
     java.net.SocketException: Too many open files
     at sun.nio.ch.Net.socket0(Native Method)
     at sun.nio.ch.Net.socket(Net.java:411)
     at sun.nio.ch.Net.socket(Net.java:404)
     at sun.nio.ch.SocketChannelImpl.<init>(SocketChannelImpl.java:105)
     at sun.nio.ch.SelectorProviderImpl.openSocketChannel(SelectorProviderImpl.java:60)
     at java.nio.channels.SocketChannel.open(SocketChannel.java:145)
     at net.i2p.router.transport.ntcp.NTCPTransport.outboundMessageReady(NTCPTransport.java:281)
     at net.i2p.router.transport.TransportImpl.send(TransportImpl.java:434)
     at net.i2p.router.transport.GetBidsJob.getBids(GetBidsJob.java:84)
     at net.i2p.router.transport.CommSystemFacadeImpl.processMessage(CommSystemFacadeImpl.java:152)
     at net.i2p.router.OutNetMessagePool.add(OutNetMessagePool.java:49)
     at net.i2p.router.tunnel.OutboundMessageDistributor.distribute(OutboundMessageDistributor.java:125)
     at net.i2p.router.tunnel.OutboundMessageDistributor.distribute(OutboundMessageDistributor.java:73)
     at net.i2p.router.tunnel.OutboundTunnelEndpoint$DefragmentedHandler.receiveComplete(OutboundTunnelEndpoint.java:75)
     at net.i2p.router.tunnel.FragmentHandler.receiveComplete(FragmentHandler.java:495)
     at net.i2p.router.tunnel.FragmentHandler.receiveSubsequentFragment(FragmentHandler.java:450)
     at net.i2p.router.tunnel.FragmentHandler.receiveFragment(FragmentHandler.java:295)
     at net.i2p.router.tunnel.FragmentHandler.receiveTunnelMessage(FragmentHandler.java:150)
     at net.i2p.router.tunnel.OutboundTunnelEndpoint.dispatch(OutboundTunnelEndpoint.java:45)
     at net.i2p.router.tunnel.TunnelDispatcher.dispatch(TunnelDispatcher.java:544)
     at net.i2p.router.InNetMessagePool.doShortCircuitTunnelData(InNetMessagePool.java:328)
     at net.i2p.router.InNetMessagePool.shortCircuitTunnelData(InNetMessagePool.java:313)
     at net.i2p.router.InNetMessagePool.add(InNetMessagePool.java:182)
     at net.i2p.router.transport.TransportManager.messageReceived(TransportManager.java:655)
     at net.i2p.router.transport.TransportImpl.messageReceived(TransportImpl.java:498)
     at net.i2p.router.transport.ntcp.NTCPConnection$ReadState.receiveLastBlock(NTCPConnection.java:1556)
     at net.i2p.router.transport.ntcp.NTCPConnection$ReadState.receiveSubsequent(NTCPConnection.java:1514)
     at net.i2p.router.transport.ntcp.NTCPConnection$ReadState.receiveBlock(NTCPConnection.java:1464)
     at net.i2p.router.transport.ntcp.NTCPConnection.recvUnencryptedI2NP(NTCPConnection.java:1289)
     at net.i2p.router.transport.ntcp.NTCPConnection.recvEncryptedFast(NTCPConnection.java:1270)
     at net.i2p.router.transport.ntcp.NTCPConnection.recvEncryptedI2NP(NTCPConnection.java:1200)
     at net.i2p.router.transport.ntcp.Reader.processRead(Reader.java:180)
     at net.i2p.router.transport.ntcp.Reader.access$400(Reader.java:21)
     at net.i2p.router.transport.ntcp.Reader$Runner.run(Reader.java:120)
     at java.lang.Thread.run(Thread.java:745)
     at net.i2p.util.I2PThread.run(I2PThread.java:103)
6/29/16 7:45:42 AM ↓↓↓ 47 similar messages omitted ↓↓↓

При этом в /etc/security/limits.conf у меня прописано

*         hard    nofile      500000
*         soft    nofile      500000
root      hard    nofile      500000
root      soft    nofile      500000

ulimit -Sn и -Hn даёт 500000 и для основнего юзера, и для рута (i2p работает из-под юзера i2psvc, под которым я не могу залогиниться, чтобы проверить лимиты, но вроде оно и там должно быть ок), в выжранные 500к дескрипторов мне как-то не очень верится, если честно. Где косяк?

Скорее всего именно в лимитах. Чтобы залогиниться под нужным юзером, выполни команду su i2psvc -s /bin/sh от рута.

Legioner ★★★★★ ()

Через пару часов после рестарта в /var/log/i2p/log-router-0.txt начинает сыпаться примерно следующее

Значит конекшены не закрываются, либо лимиты не прописались на юзера, посмотри количество конекшенов:

netstat -np | grep i2p | wc -l

foror ★★★★ ()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от foror

Да, спасибо, это активно помогло локализовать проблему, оно выдало, что Max open files 4096, а netstat дал 3900 соединений. Соответственно, вопрос - как поднять лимит помимо описанной правки limits.conf?

stetzen ★★ ()

Или, скорее, правильно будет разобраться, почему i2psvc игнорирует limits.conf

stetzen ★★ ()
Ответ на: комментарий от stetzen

/etc/security/limits.conf - это приблуда от PAM, а i2psvc может запускаться и без него. Ты же инитскриптом его запускаешь? В самом скрипте и допиши.

anonymous ()
Ответ на: комментарий от stetzen

емнип, потому что limits.conf через pam, и для демонов можно только в инит-скрипте менять
или в /etc/default/<daemon-name>, если он читается в инит-скрипте

anonymous ()
Ответ на: комментарий от anonymous

Ага, спасибо, я заткнул проблему правкой инит-скрипта, он сейчас выглядит как

do_start()
{
    [ ! -z $ULIMIT ] && ulimit -n $ULIMIT
    ulimit -Hn 500000

и оно показывает адекватный лимит теперь. Но а) я недостаточно зная баш, чтобы понять, откуда берётся переменная ULIMIT в первой строчке и б)у меня есть стойкое подозрение, что это всё костыль, подпирающий то ли баг в самом i2p, то ли кривую конфигурацию моей системы.

stetzen ★★ ()
Последнее исправление: stetzen (всего исправлений: 1)
Ответ на: комментарий от stetzen

поиском по файлу посмотри где передается значение в ULIMIT если нигде, то просто напиши $ULIMIT=500000 или сколько тебе надо

outsider ★★ ()
Последнее исправление: outsider (всего исправлений: 1)
Ответ на: комментарий от outsider

Нигде, меня это и смущает. Непонятно, откуда берется параметр для ulimit, должны же быть какие-то причины, по которым оно было написано именно в таком виде.

stetzen ★★ ()
Ответ на: комментарий от stetzen

Из конфигурационного файла скорее всего. Поищи в начале скрипта инструкции вида

. /etc/default/i2psrv
source /etc/default/i2psrv
В принципе, логичней будет там указать, чем править скрипт, который при обновлении может затереться.

anonymous ()
Ответ на: комментарий от stetzen

Я примерно такие же схемы видел в других init.d скриптах. Если запуск через Upstart или Systemd, то делают так: https://docs.mongodb.com/manual/reference/ulimit/#linux-distributions-using-u...

Насколько я знаю можно еще один для всех ulimit воткнуть, через sysctl.

foror ★★★★ ()
Последнее исправление: foror (всего исправлений: 2)
Ответ на: комментарий от stetzen

[ ! -z $ULIMIT ] && ulimit -n $ULIMIT

В данном случае если есть где-то переменная $ULIMIT, то выполнится ulimit -n $ULIMIT

 String=''   # Zero-length ("null") string variable.

if [ -z "$String" ]
then
  echo "\$String is null."
else
  echo "\$String is NOT null."
fi     # $String is null.

Это $ULIMIT можно браться откуда угодно, нужно смотреть весь скрипт.

foror ★★★★ ()
Последнее исправление: foror (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.