Коллеги, время от времени на форуме всплывают сообщения об ошибке kernel: swapper: page allocation failure.
Code:
Oct 2 23:10:21 kernel: swapper: page allocation failure. order:3, mode:0x4020
Oct 2 23:10:21 kernel: Call Trace:
Oct 2 23:10:21 kernel: [<8000de20>] dump_stack+0x8/0x34
Oct 2 23:10:21 kernel: [<8005914c>] __alloc_pages+0x294/0x344
Oct 2 23:10:21 kernel: [<80077438>] __slab_alloc+0x1d8/0x4b8
Oct 2 23:10:21 kernel: [<80077a34>] __kmalloc_track_caller+0x144/0x184
Oct 2 23:10:21 kernel: [<801a8a30>] __alloc_skb+0x70/0x140
Oct 2 23:10:21 kernel: [<8020badc>] tcp_collapse+0x214/0x468
Oct 2 23:10:21 kernel: [<8020be80>] tcp_prune_queue+0x150/0x340
Oct 2 23:10:21 kernel: [<8020c778>] tcp_data_queue+0x708/0xe10
Oct 2 23:10:21 kernel: [<8020e594>] tcp_rcv_established+0x224/0xc00
Oct 2 23:10:21 kernel: [<802167dc>] tcp_v4_do_rcv+0xe8/0x450
Oct 2 23:10:21 kernel: [<80217598>] tcp_v4_rcv+0xa54/0xb38
Oct 2 23:10:21 kernel: [<801f5604>] ip_local_deliver+0x1e8/0x318
Oct 2 23:10:21 kernel: [<801f4810>] ip_rcv_finish+0x1d0/0x464
Oct 2 23:10:21 kernel: [<801db934>] nf_reinject+0x11c/0x2b8
Oct 2 23:10:21 kernel: [<c014e1ec>] imq_dev_xmit+0x50/0x60 [imq]
Oct 2 23:10:21 kernel: [<801c1958>] qdisc_restart1+0xb4/0x21c
Oct 2 23:10:21 kernel: [<c014e360>] imq_nf_queue+0x164/0x264 [imq]
Oct 2 23:10:21 kernel: [<801db608>] __nf_queue+0x17c/0x38c
Oct 2 23:10:21 kernel: [<801dab20>] nf_hook_slow+0xe0/0x160
Oct 2 23:10:21 kernel: [<801f4d54>] ip_rcv+0x2b0/0x720
Oct 2 23:10:21 kernel: [<801afaa4>] process_backlog+0xf0/0x220
Oct 2 23:10:21 kernel: [<801ad1b0>] net_rx_action+0xb4/0x21c
Oct 2 23:10:21 kernel: [<8002d28c>] __do_softirq+0x88/0x11c
Oct 2 23:10:21 kernel: [<8002d38c>] do_softirq+0x6c/0x74
Oct 2 23:10:21 kernel: [<80007614>] plat_irq_dispatch+0x14c/0x1b8
Oct 2 23:10:21 kernel: [<80007d6c>] ret_from_irq+0x0/0x4
Oct 2 23:10:21 kernel: [<80009d1c>] cpu_idle+0x1c/0x50
Oct 2 23:10:21 kernel: [<80328c00>] start_kernel+0x2e8/0x344
Oct 2 23:10:21 kernel: Mem-info:
Oct 2 23:10:21 kernel: Normal per-cpu:
Oct 2 23:10:21 kernel: CPU 0: Hot: hi: 42, btch: 7 usd: 3 Cold: hi: 14, btch: 3 usd: 6
Oct 2 23:10:21 kernel: Active:14580 inactive:10447 dirty:1524 writeback:0 unstable:0
Oct 2 23:10:21 kernel: free:2544 slab:1628 mapped:2695 pagetables:128 bounce:0
Oct 2 23:10:21 kernel: Normal free:10176kB min:1440kB low:1800kB high:2160kB active:58320kB inactive:41788kB present:130048kB pages_scanned:0 all_unreclaimable? no
Oct 2 23:10:21 kernel: lowmem_reserve[]: 0
Oct 2 23:10:21 kernel: Normal: 0*4kB 654*8kB 305*16kB 0*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 10176kB
Oct 2 23:10:21 kernel: Swap cache: add 0, delete 0, find 0/0, race 0+0
Oct 2 23:10:21 kernel: Free swap = 0kB
Oct 2 23:10:21 kernel: Total swap = 0kB
Oct 2 23:10:21 kernel: Free swap: 0kB
Oct 2 23:10:21 kernel: 32768 pages of RAM
Oct 2 23:10:21 kernel: 0 pages of HIGHMEM
Oct 2 23:10:21 kernel: 1132 reserved pages
Oct 2 23:10:21 kernel: 22161 pages shared
Oct 2 23:10:21 kernel: 0 pages swap cached
Условия возникновения ошибки:
- прошивка RT-N16-1.9.2.7-rtn-rXXXX,
- использание роутера для скачивания торрентов,
- скорость скачивания >~200KB/s.
Использование свопа от ошибки не избаваляет. При возникновении ошибки ряд скачанных файлов оказываются "битыми". Причём ошибки возникают как при использовании rtorrent, так и при использовании transmission. В момент воспроизведения проблемы роутер не тормозит - ни в WEB-интерфейсе, ни в консоли. Единственное, что можно зафиксировать - это жутко долгое выполнение любой операции, связанной с чтением/записью на диск при скачивании торрентов.
Число открытых дискрипторов для файловой системы диска:
Code:
$ lsof +D /tmp/harddisk/ | wc -l
287
Из них открыто на запись:
Code:
$ lsof +D /tmp/harddisk/ | grep "w " | wc -l
2
Дерево процессов:
Code:
$ ps afx
PID TTY STAT TIME COMMAND
2 ? S< 0:00 [kthreadd]
5 ? S< 0:00 \_ [khelper]
4 ? S< 0:00 \_ [events/0]
3 ? RN 0:00 \_ [ksoftirqd/0]
24 ? S< 0:00 \_ [kblockd/0]
52 ? S< 0:00 \_ [kswapd0]
53 ? S< 0:00 \_ [aio/0]
51 ? S 0:00 \_ [pdflush]
50 ? S 0:00 \_ [pdflush]
105 ? S< 0:01 \_ [mtdblockd]
238 ? S< 0:00 \_ [khubd]
297 ? S< 0:00 \_ [scsi_eh_0]
298 ? D< 0:00 \_ [usb-storage]
336 ? S< 0:05 \_ [kl2tpd/0]
385 ? D< 0:00 \_ [kjournald]
1 ttyS0 Ss+ 0:00 /sbin/init
199 ? Ss 0:00 syslogd -m 0 -O /tmp/syslog.log -S -D -l 7 -b 1
202 ? Ss 0:00 klogd
205 ? S 0:00 nas
209 ? Ss 0:00 telnetd
213 ? S 0:00 dropbear -p 22 -4
594 ? Ss 0:00 \_ dropbear -p 22 -4
595 pts/0 Ss 0:00 | \_ -sh
596 pts/0 S+ 0:07 | \_ top
1270 ? Ss 0:00 \_ dropbear -p 22 -4
1362 pts/1 Ss 0:00 \_ -sh
1660 pts/1 R+ 0:00 \_ ps afx
216 ? S 0:00 httpd vlan2
221 ? S 0:00 dnsmasq
245 ? S 0:00 lld2d br0 eth1
327 ? Ss 0:00 udhcpc -i vlan2 -p /var/run/udhcpc0.pid -s /tmp/udhcp
330 ? S 0:00 l2tpd
337 ? S 0:00 \_ pppd sync nodetach noaccomp nobsdcomp nodeflate n
334 ? Ss 0:00 watchdog
366 ? S 0:00 upnp -D -L br0 -W ppp0
388 ? Ss 0:00 /usr/sbin/vsftpd
390 ? Ss 0:00 /usr/sbin/nmbd -D
392 ? Ss 0:00 /usr/sbin/smbd -D
404 ? Ss 0:00 cron
548 ? S 0:00 /opt/bin/bash /opt/bin/dlengine
1662 ? S 0:00 \_ sleep 30
559 ? S< 0:00 lighttpd -f /opt/etc/lighttpd/lighttpd.conf
560 ? S<s 0:00 \_ /opt/bin/php-fcgi
573 ? S< 0:00 \_ /opt/bin/php-fcgi
574 ? S< 0:00 \_ /opt/bin/php-fcgi
571 ? S<s 0:00 darkstat -i ppp0 -p 667 --chroot /opt/var/log
572 ? S<s 0:00 \_ darkstat -i ppp0 -p 667 --chroot /opt/var/log
585 ? S 0:00 transmission-daemon -g /opt/etc/transmission
586 ? S 0:00 \_ transmission-daemon -g /opt/etc/transmission
587 ? D 0:25 \_ transmission-daemon -g /opt/etc/transmission
588 ? S 0:00 \_ transmission-daemon -g /opt/etc/transmission
Мои догадки: в какой-то момент память RAM лавинообразно заполняется, а swapper не успевает выделить нужный объём памяти на диске. Это видно по приложенному графику: в 21:40 было снято ограничение на скорость скачивания торрента, а в 21:50 посыпались ошибки в syslog'е.

Если оценить скорость ввода-вывода на диск:
Code:
$ dd if=/dev/discs/disca/part1 of=/dev/null count=512K
524288+0 records in
524288+0 records out
268435456 bytes (268 MB) copied, 34,892 s, 7,7 MB/s
$ dd if=/dev/zero of=/tmp/harddisk/backup/nonsense.swp count=512K
524288+0 records in
524288+0 records out
268435456 bytes (268 MB) copied, 116,384 s, 2,3 MB/s
то она окажется меньше, чем пиковая скорость скачивания торрента по графикам rrd.
Пробовал воспроизвести ситуацию с помощью wget, скачивая с ПК большие файлы, но не смог получить wget'ом скорость скачивания большую, чем максимальная скорость записи на диск. wget оказался умнее меня?
Линуксоиды, есть мнение, что wget не скачивает быстрее, чем может записать на диск, используя алгоритм "скачал блок - записал блок". А вот торрент-клиенты такой логики лишены. Как мне подтвердить свои догадки?