Комментарии 90
Всяко хочу jail в linux.
openvz.org умеет даже больше чем jail.
А идеального, конечно, ничего не существует. Проблемы есть везде.
Эх... Это же ещё догадаться надо, что надо man malloc читать, а не перерывать документацию по ядру. А если её перерывать, то надо искать не слово overflow, а слово overcommit.
Нет, ну, я, конечно, сам дурак в этой ситуации, буду отрывать руки самому себе.
By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more processes will be killed by the infamous OOM killer. In case Linux is employed under circumstances where it would be less desirable to suddenly lose some randomly picked processes, and moreover the kernel version is sufficiently recent, one can switch off this overcommitting behavior using a command like
# echo 2 > /proc/sys/vm/overcommit_memory
See also the kernel Documentation directory, files vm/overcommit accounting and sysctl/vm.txt.
http://www.redhat.com/archives/fedora-de…
Много утилит написано с учётом ленивого выделения памяти, что опять же стимулирует желание оторвать. Хых. Придётся делать огромный swap.
Читайте про то, как работает оом-киллер и про ulimit конечно. Выше вам тоже верно подсказывают - в VZ все давно есть, почитайте про устройство user bean counters.
Сейчас ещё раз это проверил, всё запускается и выделяется, ядро 2.6.16.19.
# A: max address space (KB)
# C: max core file size (KB)
# D: max data size (KB)
# F: maximum filesize (KB)
# M: max locked-in-memory address space (KB) [only for root on Linux 2.0.x]
# N: max number of open files
# R: max resident set size (KB) [no effect on Linux 2.0.x]
# S: max stack size (KB)
А за что вот это все отвечает? ;)
A - это размер адресного пространства. для каждого процесса.
D - это размер сегмента данных, который при загрузке бинарника формируется для каждого процесса.
M - это залоченные в памяти страницы
S - размер стека
Чем именно мне воспользоваться?
При записи 0 в выделенную память, вылетают произвольные процессы. Включение overcommit ситуацию спасает, но опять же, можно запустить 20 процессов (в системе 8 гигабайт RAM и 16 файла подкачки), каждый из которых выделит по гигабайту памяти.
Что я делаю не так?
http://www.gentoo.org/doc/ru/security/se…
Вы забываете, что можно еще ограничить число запускаемых процессов:
nproc - max number of processes
Наложение ограничения на количество процессов + ограничение на выделяемый объем позволяет ограничить ресурсы предоставляемые пользователю.
Какой профиль Вы посоветуете, как гуру?
cat file | vzctl exec ID /somepath/somebin some args &
То, вывод cat будет передан на stdin программы, которая будет запущена в VE, а в $! будет pid процесса, под которым он будет виден в VE0?
Если так, то хорошо. Остаётся только проверить, насколько хорошо это всё с myrinet дружит.
Процесс из VE0 может иметь доступ ко всем остальным VE. В общем ну сядьте же почитать документацию! :)
--vmguarpages pages[:pages]
Memory allocation guarantee. This parameter controls how much memory is available to a VE. The barrier is the amount of memory that VE's applications are guaranteed to be able to allocate. The meaning of the limit is currently unspecified; it should be set to 2,147,483,647.
--oomguarpages pages[:pages]
Guarantees against OOM kill. Under this beancounter the kernel accounts the total amount of memory and swap space used by the VE processes. The barrier of this parameter is the out-of-memory guarantee. If the oomguarpages usage is below the barrier, processes of this VE are guaranteed not to be killed in out-of-memory situations. The meaning of limit is currently unspecified; it should be set to 2,147,483,647.
--physpages pages[:pages]
This is currently an accounting-only parameter. It shows the usage of RAM by this VE. Barrier should be set to 0, and limit should be set to 2,147,483,647.
ahould be set, unspecified и так далее. И почему только до 2147483647 - 2Gb, если я правильно понял.
Если не секрет, что такое делает ваш софт, что ему нужно много гигабайт?
Ну. Мне на это отвечают: не нравится, не кушай, покупай другое ПО. Ну, хорошо. Но почему бы не прислушаться к тому, что у пользователей вызывает проблемы, и не исправить ситуацию? Какие с этим сложности у разработчиков ядра? Это же не личное им оскорбление, а просто указание на ошибку.
Я понимаю, конечно, что мне сейчас скажут: если надо, исправляй сам. Но я в ответ спрошу, а вы пробовали сами хоть что-нибудь исправить в Linux? Никакой же документации по структуре ядра нет, а чтобы разобраться в исходниках и понять, как всё работает нужен, такое ощущение, не один год. Получается, community устроено так: либо ты linux'оид по жизни, и ничем другим заниматься уже не в праве и не в состоянии, либо ты не linux'оид и тебя никто слушать не будет, а будут показывать пальцем и говорить фууу, даже если ты предлагаешь дельные вещи. Хм... Эта нетерпимость несколько раздражает. И, с небезосновательной претензией на истину можно сказать, что мешает продвижению системы в массы.
Есть у меня Linux - многопользовательсякая и многозадачная операционная система, но при этом задачи как-то не очень уж и защищены друг от друга, пользователи тоже могут устраивать друг другу гадости, пользуясь, хотя бы этим же bug'ом в работе механизма виртуальной памяти.
Это не баг это фича и она отключается одним движением руки. И замечу вам сказали как. К тому же может скажете в какой ОС это по другому?
При этом, даже если openvz поможет с этим справиться (в чём я сильно сомневаюсь, потому что вряд ли сигналы из организованных VEi, где i > 0, можно будет отправлять в VE0, и можно будет протянуть AF_UNIX socket из одного VE в другое)
Vz полностью изолированы от друг друга. Эта штука предназначена несколько для других вещей.
Почему ядро многопользовательской и многозадачной операционной системы Linux не предоставляет эти возможности, реализовать которые не должно быть так уж и сложно?
Давайте начнем с того, что по вашему не реализовано? Лимиты на пользователя есть. Лимиты на процессы есть. Что вам еще надо?
Ну, хорошо. Но почему бы не прислушаться к тому, что у пользователей вызывает проблемы, и не исправить ситуацию?
Может это ваше ПО надо исправлять, а не ядро?
Но я в ответ спрошу, а вы пробовали сами хоть что-нибудь исправить в Linux? Никакой же документации по структуре ядра нет, а чтобы разобраться в исходниках и понять, как всё работает нужен, такое ощущение, не один год.
Даа ? А что такое каталог Documentation в исходниках ядра? И книг нет? Вот вам к примеру http://rlove.org/kernel_book/ . Сейчас с ходу не нашел, но точно помню есть аналогичная книга в открытом доступе.
Получается, community устроено так: либо ты linux'оид по жизни, и ничем другим заниматься уже не в праве и не в состоянии, либо ты не linux'оид и тебя никто слушать не будет, а будут показывать пальцем и говорить фууу, даже если ты предлагаешь дельные вещи.
Неа. Просто сначала надо прочитать документацию, описать почему указанные в документации методики вам не подходят, а затем уже начинать наезды. Если же вам не хочется читать докуметацию, то неплохо бы заплатить денег за то чтобы вам сделали. Я вообще не понимаю вашу позицию мне должны. Вам никто ничего не должен. Вам могут подсказать как решить проблему, но решать вашу проблему за вас никто не будет.
Эта нетерпимость несколько раздражает.
Ваши безосновательные наезды тоже несколько раздражают.
И, с небезосновательной претензией на истину можно сказать, что мешает продвижению системы в массы.
Еще раз вам говорю вам никто ничего не должен. Запомните это раз и навсегда. Если хотите, чтобы кто-то что-то вам был должен платите деньги. Если не хочется платить денег, тогда потратьте свое время на изучение документации.
Вы неверно расставляете акценты в моих постах. Я же не говорю, что linux - плохая система. Но в нём, в самом деле есть, что исправлять. Если linux'оиды не хотят прислушиваться - это не мои проблемы, потому что мы года через два выкатим своё ядро системы для суперкомпьютеров со всеми нужными функциями. Именно поэтому, я ничего ни от кого не требую. Если честно, мне даже выгодно, чтобы недостатки оставались : ) Можно будет тыкать потом в них пальцем на защите и говорить: смотрите, у них технические недостатки, а у нас таких нет.
А толку изучать документацию, если нет необходимой функциональности?
Какой именно? Прибивать самый толстый процесс который захавал память или не давать процессу зохавывать память?
Но в нём, в самом деле есть, что исправлять.
Идеальных систем не бывает.
Если linux'оиды не хотят прислушиваться - это не мои проблемы, потому что мы года через два выкатим своё ядро системы для суперкомпьютеров со всеми нужными функциями.
Вы уверены, что за два года вы сможете построить ядро лучше Linux?
Можно будет тыкать потом в них пальцем на защите и говорить: смотрите, у них технические недостатки, а у нас таких нет.
Флаг вам в руки и дай бог, что у вас получится что-то достойное. Кто будет заниматься разработкой и обкаткой ядра?
Java использовать никакого смысла нет. Ведь, всё это делается в погоне за скоростью вычислений, Java же на расчётных задачах весьма неспешно работает http://shootout.alioth.debian.org/, а ускорителей у нас для неё нет.
Кроме того, в вычислительных приложениях, обычно, память выделяется редко, просто её выделяется ОЧЕНЬ много, меньше выделять просто нельзя, потому что данных тоже ОЧЕНЬ много. В этом проблема.
Вот надо ли вообще столько памяти? У вас ваши разработчики про дисциплину "численные методы" слышали? :)
java работает вполне спешно на счетных задачах. Где-то по скорости C. Но это конечно зависит от многих факторов.
Они, конечно, оптимизируют, выдумывают новые методы, защищают на этом кандидатские и докторские и сами пишут книги по 'численным методам'.
Хм. Если у них одна матрица занимает 120Gb (она не разреженная, она просто такая вот), какие численные методы позволят сэкономить память?
Такая матрица и так в память не помещается. Так что прийдется вам ее разбивать, на части для обработки. К тому же сжатие и распараллеливание еще никто не отменял.
Они, конечно, оптимизируют, выдумывают новые методы, защищают на этом кандидатские и докторские и сами пишут книги по 'численным методам'.
Но при этом они могут и не использовать методы оптимизации которые для программиста лежат на поверхности. IMHO для написания подобных программ желательно иметь двух человек программиста и собственно исследователя.
Такая матрица и так в память не помещается. Так что прийдется вам ее разбивать, на части для обработки. К тому же сжатие и распараллеливание еще никто не отменял.
Ну так и параллелят. Но нужно стараться сделать куски как можно большими, потому что так меньше накладных расходов на пересылку данных. При этом с подбором подходящего размера проблемы - не только, ведь, матрицы в программе фигурируют, есть ещё другие переменные, которые тоже память занимают. А чтобы подбирать оптимальный размер, нужен механизм, который скажет: нет уважамый, столько памяти мы тебе уже не выделим.
Но при этом они могут и не использовать методы оптимизации которые для программиста лежат на поверхности. IMHO для написания подобных программ желательно иметь двух человек программиста и собственно исследователя.
Угу. Это вы скажите начальникам из правительства РФ, которые всё увеличивают и увеличивают финансирование исследований : ) Из последних сил увеличивают, взмокли уже все и раскраснелись, штаны у них бедненьких и пиджаки по швам трещат, а увеличить никак не могут.
Но с другой стороны, если Linux не позволяет эффективно разобраться пользователю с этой проблемой. И если для этого нужны дополнительные программисты, администраторы, финансирование, то возникает вопрос к эффективности самого Linux. Тем более, если это всё можно решить простыми методами в ядре, без привлечения к ответу правительства РФ?
А чтобы подбирать оптимальный размер, нужен механизм, который скажет: нет уважамый, столько памяти мы тебе уже не выделим.
Зря вы не используете java. Там есть специальная опция для виртуальной машины.
Но с другой стороны, если Linux не позволяет эффективно разобраться пользователю с этой проблемой.
Позволяет. Штатных средств в виде ulimit в большинстве случаев хвает. К тому же никто вам не запрещает, запускать все приложения с ограничениями.
И если для этого нужны дополнительные программисты, администраторы, финансирование, то возникает вопрос к эффективности самого Linux.
К эффективности ваши проблемы не имеют никакого отношения.
Тем более, если это всё можно решить простыми методами в ядре
Опишите механизм который бы хотелось. А я вам скажу почему это не сделано :)
Так что это не вариант, несмотря на все достоинства решения. Если мне не верите или считаете, что мы - существа криворукие и плоскоголовые, к программированию на java не приспособленные, можете сами тесты погонять, благо математических библиотек, написанных на java в internet много.
Мне нужен простой механизм: ограничить группу процессов по памяти. Я не понимаю, какие проблемы завести счётчик физически использованных страниц для пользователя ли, для группы ли - не суть важно, и если счётчик переваливает определённый предел, убивать именно эту группу процессов или выкидывать из системы именно этого пользователя.
Зачем для этого обязательно нужен сложный openvz, которй, кстати, только что убил 80% производительности тесту LAPACK. Почему в VPS'ах так жутко падает скорость передачи данных? Вместо 1.5 гигабита в секунду на бондинге получаю .7 гигабита плюс дикую загрузку процессора в 50%. Что надо исправить в настройках?
Мы не используем java по одной очень простой причине, тестовые программы, написанные на ней (преобразования Фурье, умножения матриц, расчёт систем из большого количества тел) работают раз в 10 медленней, чем программы на С, откомпилированные gcc.
Какая java машина и какое ядро Linux?
А теперь представьте, что средняя программа у нас оптимизированная и вылизанная, в том числе и по доступам в линии кэша, да ещё и с переписанными на ассемблере некоторыми функциями, чтобы хорошо использовать SSE2, грызёт данные около 60 часов подряд.
Так у вас софт таки на C или на асме частично?
Так что это не вариант, несмотря на все достоинства решения. Если мне не верите или считаете, что мы - существа криворукие и плоскоголовые, к программированию на java не приспособленные, можете сами тесты погонять, благо математических библиотек, написанных на java в internet много.
У меня есть знакомый, они гоняют расчетные задачи в кластере на Java.
Мне нужен простой механизм: ограничить группу процессов по памяти. Я не понимаю, какие проблемы завести счётчик физически использованных страниц для пользователя ли, для группы ли - не суть важно, и если счётчик переваливает определённый предел, убивать именно эту группу процессов или выкидывать из системы именно этого пользователя.
Хорошо задам очень простой вопрос. Как будете классифицировать относятся процессы к этой группе или нет?
Зачем для этого обязательно нужен сложный openvz
Он обеспечивает песочницу, которая не позволяет обеспечить практически железнобетонную защиту.
Почему в VPS'ах так жутко падает скорость передачи данных? Вместо 1.5 гигабита в секунду на бондинге получаю .7 гигабита плюс дикую загрузку процессора в 50%. Что надо исправить в настройках?
Какой тип соединения VZ с корневой системой используете?
Софт у нас на разных языках. Кое что переписываем на ассемблер, если видно, как оптимизировать можно.
В UNIX есть понятие - группа процессов, почему по её номеру нельзя ориентироваться? Или на крайний случай просто по uid.
А что есть тип соединения с корневой системой? Я пока глупый в openvz и мне пальцем надо показывать. Если имеется в виду то, как к сети доступ выдан, так при помощи такой штуки:
vzctl set 101 --netdev_add bond0 --save
Взял из OpenVZ-Users-Guide.pdf.
Тестировали две, которые считаются (считались?) самыми производительными: JRockit 5.0 R27 и IBM J2SE 2.0 SR4, ядро 2.6.17.
Ну щас и от Sun неплохи, только там надо указывать, что приложение серверное имеется специальный ключ.
В UNIX есть понятие - группа процессов, почему по её номеру нельзя ориентироваться? Или на крайний случай просто по uid.
Группы процессов в Unix нет. Есть понятие child process и вполне возможно, что на них как раз ulimit parent действует. По uid кстати реализовано в limits только вот число процессов надо указывать и делить на них объем памяти.
Если имеется в виду то, как к сети доступ выдан, так при помощи такой штуки:
vzctl set 101 --netdev_add bond0 --save
Попробуйте через виртуальные устройства. Так как если у вас только одно подключение через bonding оно может работать медлено.
эх… руки бы поотрывать разработчикам linux