> Тут ключевой вопрос - а может ли кернел это быстро забрать взад когда сие потребуется программам?Быстро - не может, чудес не бывает.
Вот тебе старый линукс, с еще человекочитаемым free:
total used free shared buffers cached
Mem: 3085136 2863632 221504 0 415804 1005072
-/+ buffers/cache: 1442756 1642380
Swap: 4194300 52244 4142056
Чего бы он в swap залез, когда оно "free"? И зачем-то держит зазор, пусть и 5%, хотя весь тот своп бы поместился и еще осталось.
Причина вполне банальная - быстро отдать это cached не получится. Чтобы оттуда отдать - надо перебрать табличку структурок, состоящую, на минутку, у нас 4k pages, из 251268 (блжад!) айтимов - желательно не первые попавшиеся оттуда выбрасывать, а хотя бы те к которым долго не было обращений (лучшее, что умеет линукс).
Кстати, для этого потребуется память, нужна ж нам табличка кандидатов из той таблички на вынос ;-) Добавь сюда что системы у нас дохреллион-процессорные и все это через локи.
Поэтому, если ты полезешь рыться в исходниках - почти наверняка найдешь ровно то же самое, что и в исходниках zfs - асинхронный механизм, возможно и не один, пытающийся предугадать, сколько памяти может потребоваться в ближайшее время - на основании того, сколько ее уже попросили недавно.
И вот эти механизмы - они сложные, не всегда быстрые и завязаны на кучу внутренних систем ядра. Неаккуратное вмешательство в них ведет к 12309 в лучшем случае (в худшем - к lockup, когда негде взять память, чтобы поискать свободную память, потому что мы уже ищем свободную память и память для этого кончилась).
Кстати, никто не обещал тебе, что это единственное место в системе, где есть динамически расходуемая память, и что ее вообще надо сейчас трогать (представь систему с основными дисками на nfs, или, того хуже, ceph). К сожалению, в линуксе нет никакого общедоступного способа ее посмотреть, и даже понять, относится ли она к "buffers" или показывается просто как занятая ядром.
> Не говоря о том что нынче прогеры размякли и к mem alloc failure часто не готовы морально
они часто еще более неготовы к подождать, пока освободится (ты в линку в бравзере ткнул - и у тебя повисло все вообще - потому что понадобилась память отобразить инвалидо-френдли индикатор бурной деятельности, и система пошла поискать - пупсики ж не поймут такого)