Re: почему ядро не сбрасывает кэш?
2 декабря 2015 г., 15:47 пользователь Aleksandr Sytarнаписал: > > Все несколько сложнее чем кажется на первый взгляд, но сообщения о нехватке > памяти может быть получено когда память есть, но не та которая нужна > приложению - в данном случае java попросила 1 страницу 8к, и их не > оказалось, а вот страниц 4к, 16к и т.д. вполне могло быть в достатке. Это какие новости операционно-системо-строения. С какого это рожна приложению не всё равно какая там память? Приложение оперирует виртуальными адресами и две соседние по виртуальным адресам страницы памяти могут лежат в противоположных уголках физической. И ничего приложение про это не узнает. Поэтому если у ядра есть две странички по 4К, выделить их приложению и промапить их на подрядидущие адреса не составляет никакого труда. Если подходящий свободный диапазон виртуальных адресов есть в пространстве процесса. Кроме того, не знаю о какой архитектуре идет речь, но на x86 все страницы, кроме huge, 4k. Поэтому не понятно, о каких страницах по 16К вы тут пишите. -- With best regards Max Dmitrichenko
Re: почему ядро не сбрасывает кэш?
On 12/9/15, Max Dmitrichenkowrote: >> Все несколько сложнее чем кажется на первый взгляд, но сообщения о >> нехватке >> памяти может быть получено когда память есть, но не та которая нужна >> приложению - в данном случае java попросила 1 страницу 8к, и их не >> оказалось, а вот страниц 4к, 16к и т.д. вполне могло быть в достатке. > > Это какие новости операционно-системо-строения. С какого это рожна > приложению не всё равно какая там память? Приложение оперирует > виртуальными адресами и две соседние по виртуальным адресам страницы > памяти могут лежат в противоположных уголках физической. И ничего > приложение про это не узнает. Поэтому если у ядра есть две странички > по 4К, выделить их приложению и промапить их на подрядидущие адреса не > составляет никакого труда. Если подходящий свободный диапазон > виртуальных адресов есть в пространстве процесса. > > Кроме того, не знаю о какой архитектуре идет речь, но на x86 все > страницы, кроме huge, 4k. Поэтому не понятно, о каких страницах по 16К > вы тут пишите. О buddy-аллокаторе разговор, у него разные страницы, видимо, не совсем правильно называть их страницами.
Re: почему ядро не сбрасывает кэш?
On 12/3/15, Oleksandr Gavenkowrote: ... > Итого везде приводится один и тот же рецепт: > > vm.min_free_kbytes = 65536 $sysctl vm.min_free_kbytes vm.min_free_kbytes = 512000 Так что, теоретически, свободной памяти навалом :) > > иногда упоминается vm.zone_reclaim_mode. Вот с этим надо будет поиграться.
Re: почему ядро не сбрасывает кэш?
On 2015-12-02, Hleb Valoshka wrote: > Вы вопрос-то прочитали? Между строк )) По последующей дискусии вьехал. По: http://serverfault.com/search?q=page+allocation+failure есть несколько интересных обсуждений: http://serverfault.com/questions/645831/server-overloaded-acts-like-out-of-memory-but-thats-not-true Theres a lot of free memory, but these zones are totally fragmented Посмотреть можно по cat /proc/buddyinfo. http://serverfault.com/questions/236170/page-allocation-failure-am-i-running-out-of-memory [why to "sysctl -w vm.min_free_kbytes=65536"] Swap-less machines, where you don’t want incoming network traffic to overwhelm the kernel and force an OOM before it has time to flush any buffers. x86 machines, for the same reason: the x86 architecture only allows DMA transfers below approximately 900MB of RAM. So you can end up with the bizarre situation of an OOM error with tons of RAM free. По https://www.google.com.ua/search?q=swapper+mode+0x20 есть: https://access.redhat.com/solutions/90883 * Increase vm.min_free_kbytes value, for example to a higher value than a single allocation request. * Change vm.zone_reclaim_mode to 1 if it's set to zero, so the system can reclaim back memory from cached memory. https://bugzilla.kernel.org/show_bug.cgi?id=12135 [SKIP]while transferring a 54GB backup (single file) through a 1Gbps link[/SKIP] the network is allocating memory faster than the VM system is reclaiming it. Everything should recover and run to completion. You should be able to make the warning go away by increasing /proc/sys/vm/min_free_kbytes. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666021 There is a common problem that network hardware may require multi-page buffers, which we can't allocate (without swapping, which is not possible in the network stack) if memory is nearly full and fragmented. This case is similar but slightly different: the multi-page allocation is for a new socket for a TCP connection. Итого везде приводится один и тот же рецепт: vm.min_free_kbytes = 65536 иногда упоминается vm.zone_reclaim_mode. Мне было интересно покопаться, до настоящего момента о указанном выше ничего не знал. -- Best regards!
Re: почему ядро не сбрасывает кэш?
On 12/2/15, Aleksandr Sytar <sytar.a...@gmail.com> wrote: >> А вот сегодня мне пришлось вручную сбрасывать кэш, занимавший около >> 60% всего объёма ОЗУ, пока этого не сделал, была загрузка процессора >> ядром под 90% и в логи валились сообщения типа "[6848409.216723] java: >> page allocation failure. order:1, mode:0x20 >> [6848409.216929] Pid: 17814, comm: java". >> >> Там ещё прозрачные huge pages включены, но это, думаю, не столь важно. >> >> Вопрос, почему ядро не сбрасывает кэш? >> > > Все несколько сложнее чем кажется на первый взгляд, но сообщения о нехватке > памяти может быть получено когда память есть, но не та которая нужна > приложению - в данном случае java попросила 1 страницу 8к, и их не Это вы к примеру сказали, или из сообщения определили (order:1, mode:0x20)? > оказалось, а вот страниц 4к, 16к и т.д. вполне могло быть в достатке. И при этом 250 ГБ заняты под кэш, почему бы не почистить его?
Re: почему ядро не сбрасывает кэш?
2 декабря 2015 г., 17:33 пользователь Hleb Valoshka <375...@gmail.com> написал: > On 12/2/15, Aleksandr Sytar <sytar.a...@gmail.com> wrote: > >> А вот сегодня мне пришлось вручную сбрасывать кэш, занимавший около > >> 60% всего объёма ОЗУ, пока этого не сделал, была загрузка процессора > >> ядром под 90% и в логи валились сообщения типа "[6848409.216723] java: > >> page allocation failure. order:1, mode:0x20 > >> [6848409.216929] Pid: 17814, comm: java". > >> > >> Там ещё прозрачные huge pages включены, но это, думаю, не столь важно. > >> > >> Вопрос, почему ядро не сбрасывает кэш? > >> > > > > Все несколько сложнее чем кажется на первый взгляд, но сообщения о > нехватке > > памяти может быть получено когда память есть, но не та которая нужна > > приложению - в данном случае java попросила 1 страницу 8к, и их не > > Это вы к примеру сказали, или из сообщения определили (order:1, mode:0x20)? > (2^order)*page_size - количество нехвативших страниц > > оказалось, а вот страниц 4к, 16к и т.д. вполне могло быть в достатке. > > И при этом 250 ГБ заняты под кэш, почему бы не почистить его? > Почистить можно то что свободно, то что занято можно выдавить в свап, но не сразу, а только через dirty_background_ratio и подобным ручкам. Но при этом нужно понимать - если система будет перекладывать страницы в свап, она будет дольше из него доставать (поищи страницы в памяти, получи ошибку, что она в свапе, загрузи в память, отдай приложению), что скажется на скорости работы. Поэтому разумнее ограничить аппетиты нового приложения с учетом текущих реалий по кешу.
Re: почему ядро не сбрасывает кэш?
On 2015-12-02, Hleb Valoshka wrote: > Вопрос, почему ядро не сбрасывает кэш? Известная страница: http://www.linuxatemyram.com/ Кроме юмора есть детали: http://www.linuxatemyram.com/play.html -- Best regards!
Re: почему ядро не сбрасывает кэш?
On 12/2/15, Oleksandr Gavenko <gaven...@gmail.com> wrote: >> Вопрос, почему ядро не сбрасывает кэш? > > Известная страница: > > http://www.linuxatemyram.com/ > > Кроме юмора есть детали: http://www.linuxatemyram.com/play.html Вы вопрос-то прочитали?
Re: почему ядро не сбрасывает кэш?
On 12/2/15, Aleksandr Sytarwrote: >> Это вы к примеру сказали, или из сообщения определили (order:1, >> mode:0x20)? > (2^order)*page_size - количество нехвативших страниц В логах 71 запись, из них 39 принадлежат процессц swapper, pid 0, 1 - kswapd0, ещё 26 яве, остальное прочим, и всем не хватало 1-ого буфера в 8 кб. И это на машине с 512 ГБ ОЗУ и 2 ГБ свопа. >> И при этом 250 ГБ заняты под кэш, почему бы не почистить его? > Почистить можно то что свободно, то что занято можно выдавить в свап, но не > сразу, а только через dirty_background_ratio и подобным ручкам. Это тянулось явно побольше 10 сек (dirty_background_ratio), при этом, после чистки руками, кэш до 200 ГБ около часа, т.е. кандидатов на выбросить оттуда было более чем достаточно. > Но при этом нужно понимать - если система будет перекладывать страницы в > свап, она будет дольше из него доставать (поищи страницы в памяти, получи > ошибку, что она в свапе, загрузи в память, отдай приложению), что скажется > на скорости работы. Поэтому разумнее ограничить аппетиты нового приложения > с учетом текущих реалий по кешу. Приложение уже ограничено по памяти, т.к. ява. Учитывая соседнюю тему, где сброс кэша помогает ускорить apt-get, несмотря на наличие 12 ГБ свободной памяти, есть подозрение, что в Линуксе работа с памятью поломана.
почему ядро не сбрасывает кэш?
Классическая ситуация: поставил кто-то себе GNU/Linux, узнал о существовании комманды free и пишет в рассылки/форумы/irc: "а куда делась вся свободная память?", а ему отвечают: "не парься. кэш видишь? будет нужна память ядро само почистит кэш, и вернёт память". А вот сегодня мне пришлось вручную сбрасывать кэш, занимавший около 60% всего объёма ОЗУ, пока этого не сделал, была загрузка процессора ядром под 90% и в логи валились сообщения типа "[6848409.216723] java: page allocation failure. order:1, mode:0x20 [6848409.216929] Pid: 17814, comm: java". Там ещё прозрачные huge pages включены, но это, думаю, не столь важно. Вопрос, почему ядро не сбрасывает кэш?
Re: почему ядро не сбрасывает кэш?
2 декабря 2015 г., 14:23 пользователь Hleb Valoshka <375...@gmail.com> написал: > Классическая ситуация: поставил кто-то себе GNU/Linux, узнал о > существовании комманды free и пишет в рассылки/форумы/irc: "а куда > делась вся свободная память?", а ему отвечают: "не парься. кэш видишь? > будет нужна память ядро само почистит кэш, и вернёт память". > > А вот сегодня мне пришлось вручную сбрасывать кэш, занимавший около > 60% всего объёма ОЗУ, пока этого не сделал, была загрузка процессора > ядром под 90% и в логи валились сообщения типа "[6848409.216723] java: > page allocation failure. order:1, mode:0x20 > [6848409.216929] Pid: 17814, comm: java". > > Там ещё прозрачные huge pages включены, но это, думаю, не столь важно. > > Вопрос, почему ядро не сбрасывает кэш? > Все несколько сложнее чем кажется на первый взгляд, но сообщения о нехватке памяти может быть получено когда память есть, но не та которая нужна приложению - в данном случае java попросила 1 страницу 8к, и их не оказалось, а вот страниц 4к, 16к и т.д. вполне могло быть в достатке. Подробнее - Understanding The Linux Virtual Memory Manager - https://www.kernel.org/doc/gorman/pdf/understand.pdf