(fwd) Re: Swap & Linux

Andrey Gerzhov (kittle@freeland.alex-ua.com)
Tue, 3 Nov 1998 02:20:24 +0200 (EET)

-- forwarded message --
Path: freeland.alex-ua.com!barmaglot.alex-ua.com!f188.n463.z2!f116.n463.z2!f58.n463!f59.n463!valimar.materials.kiev.ua!not-for-mail
Newsgroups: fido.ru.os.cmp
Distribution: fido
X-Comment-To: Andrey Rudyavsky
From: Cyril Rotmistrovsky <cyr@materials.kiev.ua>
X-FTN-Sender: Cyril Rotmistrovsky <Cyril.Rotmistrovsky@p60.f59.n463.z2.fidonet.org>
Reply-To: cyr@materials.kiev.ua
Date: Wed, 28 Oct 98 15:38:33 +0200
Subject: Re: Swap & Linux
Message-ID: <m34sso3ixy.fsf@valimar.materials.kiev.ua>
References: <734505837@p4.f106.n5000.z2.fidonet.ftn> <909440156@p30.f269.n5030.z2.ftn>
Organization: Microsoft free station
X-FTN-AREA: RU.OS.CMP
X-FTN-MSGID: valimar.materials.kiev.ua f01ad37b
X-FTN-REPLY: 2:5030/269.30 3634f49c
X-FTN-REPLYADDR: cyr@materials.kiev.ua
X-FTN-REPLYTO: 2:463/59.60@fidonet UUCP
Sender: cyr@valimar.materials.kiev.ua
NNTP-Posting-Host: localhost
X-Newsreader: Gnus v5.5/XEmacs 20.4 - "Emerald"
X-FTN-Tearline: ifmail v.2.14
X-FTN-Origin: Microsoft free station (2:463/59.60@fidonet)
X-FTN-SEEN-BY: 463/5 58 59 61 72 116 126 159 166 188 244 308 432 600 5020/238
X-FTN-PATH: 463/59 58 116
X-FTN-PATH: 463/188
Lines: 131
Xref: freeland.alex-ua.com fido.ru.os.cmp:9209

>>>>> En Mon, 26 Oct 98 21:53:23 +0200 Andrey Rudyavsky (AR) as ecrit:

AR> ..., ибо со свопом у фpуниксов(линукс конкpетно) плохо. Резко
AR> падает пpоизводитьльность пpичем не линейно.

DS> А вот с этого места, пожалуйста, по подробнее...
DS> Производительность падает во время свопинга ровно настолько,
DS> насколько много надо прочитать/записать на диск. Причем это во всех
DS> системах так.

AR> Cия инфоpмация получена мной с чужих слов. Сам я не копался в этом
Это видно.
AR> и не пpовеpял, пока... Hо с моими личными впечатлениями от линукса
AR> на 486-133/16 вполне согласуется.
Hу-ну.
AR> Пpи нехватке памяти линукс выкидывает в своп пеpвую попавшуюся
AR> стpаницу.
Бред.
1) При нехватке свободной памяти линукс дискардит кэш, не нуждающийся
в записи.
2) При нехватке discardable cache linux дискардит давно не
использовавшиеся страницы текста (текст==код в терминологии унихов) или
read-only данных.
3) При нехватке discardable-страниц linux шлет наглой задаче сигнал
(SIGBUS), по которому задача обычно умирает (но может и принять меры).
3.1) Hо существует два псевдо-процесса, имеющие высший приоритет (и текст
которых живет в бинаре ядра), которые занимаются следующим:
i) kflushd периодически (по таймеру?) просматривает списки страниц,
которые должны быть записаны на винт, но еще не записаны, и
записывает их: сначала самые старые, потом более новые; делая их
таким образом discardable.
ii) kswapd периодически (по таймеру?) проверяет количество свободной
памяти, и в зависимости от него (watermarks runtime-настраиваемы)
сбрасывает давно не использовавшиеся страницы модифицированных
данных (т.е. тех, которые нельзя уже подкачать из файлов, включая
бинарники) в своп, делая их таким образом discardable.
Так, если программы начинают валиться по SIGBUS - надо чуть поменять
watermarks (но такое бывает крайне редко). А вообще изменением
watermarks можно сильно изменить отношение линукса к своппингу (в
любую сторону). И подстроить это отношение под класс задач (BTW,
это можно делать автоматически, из скрипта).

Т.е. обрашение к винту идет не по нехватке памяти, а по возможности и
необходимости обращения.

Это все написано достаточно обще и, может, некоторые детали неверны... но
подробности можно прочитать в file:/usr/src/linux/Documentation/sysctl/vm.txt.

AR> освобождении памяти в линуксе не пpоисходит, а пpоисходит пеpегонка
AR> набоpа одних и тех же стpаниц в своп и обpатно. Это пpиводит к
AR> полнейшему ступоpу в Х-сах если памяти мало, а пpиложения ее хотят
AR> и очень настойчиво. Сказанное, как увеpялось, веpно для 2.0.29.

Хм... Вот сейчас пробую такое: GUI-шная программка дает mysql запрос
"select * from Table50MbSize", результат которого размещает в связном(!)
списке, отображаемом в ListView. Результат такой:

1. mysqld выполняет запрос, и буферизуя результат шлет его программе.
2. программа (библиотека клиента) собирает этот результат в постоянно
растущий (!) char ** result
3. по завершении вызова query смысловая часть программы разгребает
каждую запись в элемент связного списка, который указывает на массив
указателей на вновь отведенные строки, в которые копируются
значения полей
4. освобождается char ** result

Алгоритм крайне неэффективный для такой задачи, жрущий гораздо больше
памяти, чем надо ( ~50Mb на result, а потом... мег 70 на связный список,
и только потом result освобождается). Задача выполняется локально,
ожидания результата нет (считая задачей mysqld+моя программа), памяти
64Mb (мег 40 + мег 20 свопа заняты изначально); поэтому основным
занятием системы _должен_ быть пэйджинг, на втором месте - чтение
базы с того же диска (ide).

Итак, читаем 50Mb (база), при этом пишем 50Mb (в своп), потом читаем
50Mb (из свопа), при этом пишем 70Mb (в своп) => минимум 220Mb надо
прогнать через винт. В процессе некоторые программы тоже просятся на
своп/чтение диска. Исходя из 1Mb/s (характерная скорость обмена с
винтом) получаем 220секунд, т.е. 3.5 минуты.

Hа деле получается больше... LA у меня чуть меньше 2х, т.е. ожидание
одного процесса другим таки есть, но маленькое; swapin/swapout - порядка
сотни килобайт в секунду (очень неравномерен; таки mysql и mysqlclient много
времени тратят на всякие reallocи при объемах результатов > 10Mb). О,
вот два rxvt в бэкграундовыми пиксмапами (24bpp) и top/vmstat,
обновляющимися раз в секунду, вступили в борьбу: LA поднялся почти до
4х. Своп 95Mb, кэш - 45Mb, процесс идет ... ну, с такими si+bi
(подросшими до 300k/s) нужно минут 15... кстати, я сейчас совершенно
нормально пишу это письмо, даже не приходится радоваться оптимальности
xemacs для медленной графики... разве что переключалка раскладок лежит в
свопе и иногда надо делать секундную паузу, чтобы дождаться, пока она
пикнет. Да, переключение между окошками - две секунды (у меня при этом
играет ding.wav и пищит переключалка клавиатуры: она для каждого окна
держит свое состояние). Самый наглый процесс - vmstat (еще бы: всем
известно, что самые жрущие процессы - мерялки аппетита :), за ним -
kswapd (о! таки ему есть, что делать). Ладно, отвлекусь, поработаю минут
10 над задачей...

Что...все? Все. 29 минут. При нормальной моей работе. Многовато, конечно
(IMHO), но, во-первых, я не знаю деталей реализации QListBoxItem,
mysql_client, во-вторых, ради чистоты эксперимента, я достаточно
полноценно работал при этом (в частности, переключал десктопы, а
у меня 1152x864x24bpp, т.е. обои только весят 3Mb); при этом несколько
раз пускались (cronом) всякие send-ifmail, ifpack,ifunpach, squid что-то там
делал. Винт шуршал прилично. Hо особых тормозов небыло - только
переключение десктопов требовало секунд пять--семь (еще бы: только обои из
свопа вынуть - 3Mb).

AR> ЗЫ: Чел(юниксоид) посидел 1,5 года за линуксом на Р166/32, дык ему
AR> тепеpь ос/2 4.0 МЕРИH с WPS кажется летающей на 486sx-33/16M !!!

Вот и странно мне, ибо когда я пересел с Warp3 (после трех лет) на Linux
(5x86/133/32Mb), я обнаружил удивительную вещь: своп совершенно не нужен
для нормальной работы. Правда, с тех пор (еще три года) я поднял и проц,
и память, и видеокарту, и полюбил xemacs, squid, kde, netscape (каждый
из которых весьма прожерлив), да и Xы с emacsом пускаю в двух
экземплярах (от разных пользователей), так что 20Mb при 64Mb RAM свопа
меня не пугают... но и 100Mb не мешают. А иногда еще 64M swapfile
приходится добавлять (это уже на счетных задачках)...

AR> Всего наилучшего!(Whole Best!) Andrey < back@gate.la.spb.ru >

-- 
	Soiree,
		Cyril.

: Если вовpемя надеть пpотивогаз, то мгновенная смеpть настyпит не сpазy.

-- end of forwarded message --

-- 
С тем, что не помешает никогда,
                                               Kittle