Много лет тому назад, в одной далекой галактике войска Императора собирали в космосе очередную Звезду Смерти. Нет, это из другой баечки. Начнем еще раз ...
Много лет тому назад, в одно софтверной компании группа разработчиков работала над очередным Скучным Индустриальным Проектом, который к ним за-outsource-или из Индии(!).
Основной задачей проекта было взять Большую Индустриальную Систему и заменить в ней "толстого клиента" на web GUI. Чтобы, так сказать, в духе времени обновить порядком устаревший интерфейс. С серверной стороны планировался код на яве, который при помощи самопального протокола общался с основными модулями системы, написанными на С++ под Solaris. Не смущайтесь, зевайте-зевайте. Я тоже всегда зеваю, когда мне интересно.
Чтобы можно было нормально тестироваться, на какой-то мелкий 1U сервер был подставлен Solaris под Intel, и на нем развернута основная часть системы. После чего началась работа над web GUI. Долго ли, коротко ли, дошло дело до того, что GUI можно было пытаться использовать и даже получать через него реальные данные от основных модулей системы. Всю новую функциональность разработчики, понятное дело, тут же проверяли в деле.
Через какое-то время GUI вырос и начал ощутимо тормозить. Разработчики почесали репу и сказали: "Ага! Это у нас неэффективное внутренне представление данных на сервере!". И переписали его. Ура, GUI стал просто летать!
Правда, добавили еще пять-десять фич, и GUI опять начал тормозить. Разработчики опять почесали репу и сказали: "Ага! Это у нас тормознутый persistent layer на сервере!". И оптимизировали его. Выжали процентов 20% производительности.
Правда, дописали еще пару фич, и GUI опять начал тормозить. Разработчики почесали репу, почесали репу еще раз, скурили все сигареты и сказали: "Ага! Это у нас хреновая архитектура! Ну, ща мы ее за-refactor-им!". И сделали refactoring. Выжалось еще процентов 10%. А должно было сильно больше.
Тут разработчики взяли в руки профайлер, и увидели, что самые большие тормоза - в тот момент, когда мы по самопальному протоколу поверх TCP/IP получаем данные из одного из основных модулей системы. Ага. Дальше разработчики взяли в руки telnet, соединились с этим модулем и убедились - действительно тормозит. Хотя по идее тормозить там было особенно нечему - в данном конкретном случае основной модуль должен был передать что-то очень простое, вроде локального времени на том сервере, где он работает.
Тут разработчики взяли в руки truss, и стали трассировать основной модуль системы (так как его исходников им не дали). И увидели, что тормоза происходят в момент вызова "fopen(tmpfile, "r")", где tmpfile - что-то вроде "/tmp/xyz.6787876"
Разработчики удивились, и пошли в "/tmp". Там они сделали "touch somefile". Елки, натурально тормозит на создании пустого файла. И "rm somefile" (удаление, стало быть) тоже тормозит. В логах никаких ошибок нет, по S.M.A.R.T. выходит, что винт жив-здоров, файловая система тоже без ошибок. Мистика какая-то ...
И тут кто-то случайно запустил "ls". И очень удивился, не увидев результата. То есть, вообще никакого результата. Даже более того - не увидев командного промпта. То есть, набираем ls, нажимаем ввод и тишина. Пять секунд тишина, десять - тишина, минута - тишина, 3 минуты - тишина ...
По прошествии 5-10 минут ls стал выдавать результат... Оказалось, что индусские авторы основного модуля системы не имел привычки удалять за собой временные файлы. И их накопилось в /tmp совершенно неприличное количество. Настолько неприличное, что обновление директории при создании нового файла занимало от нескольких до десятка секунд.
Разработчики запустили "xargs -i * | rm {}" и ушли с горя напиваться. С другой стороны - если бы не этот баг в чужом коде, фиг бы они нашли время для всех оптимизаций и рефакторинга.
Остается только догадываться, как это умудрялось работать в Серьезных Индустриальных Инсталляциях.
Много лет тому назад, в одно софтверной компании группа разработчиков работала над очередным Скучным Индустриальным Проектом, который к ним за-outsource-или из Индии(!).
Основной задачей проекта было взять Большую Индустриальную Систему и заменить в ней "толстого клиента" на web GUI. Чтобы, так сказать, в духе времени обновить порядком устаревший интерфейс. С серверной стороны планировался код на яве, который при помощи самопального протокола общался с основными модулями системы, написанными на С++ под Solaris. Не смущайтесь, зевайте-зевайте. Я тоже всегда зеваю, когда мне интересно.
Чтобы можно было нормально тестироваться, на какой-то мелкий 1U сервер был подставлен Solaris под Intel, и на нем развернута основная часть системы. После чего началась работа над web GUI. Долго ли, коротко ли, дошло дело до того, что GUI можно было пытаться использовать и даже получать через него реальные данные от основных модулей системы. Всю новую функциональность разработчики, понятное дело, тут же проверяли в деле.
Через какое-то время GUI вырос и начал ощутимо тормозить. Разработчики почесали репу и сказали: "Ага! Это у нас неэффективное внутренне представление данных на сервере!". И переписали его. Ура, GUI стал просто летать!
Правда, добавили еще пять-десять фич, и GUI опять начал тормозить. Разработчики опять почесали репу и сказали: "Ага! Это у нас тормознутый persistent layer на сервере!". И оптимизировали его. Выжали процентов 20% производительности.
Правда, дописали еще пару фич, и GUI опять начал тормозить. Разработчики почесали репу, почесали репу еще раз, скурили все сигареты и сказали: "Ага! Это у нас хреновая архитектура! Ну, ща мы ее за-refactor-им!". И сделали refactoring. Выжалось еще процентов 10%. А должно было сильно больше.
Тут разработчики взяли в руки профайлер, и увидели, что самые большие тормоза - в тот момент, когда мы по самопальному протоколу поверх TCP/IP получаем данные из одного из основных модулей системы. Ага. Дальше разработчики взяли в руки telnet, соединились с этим модулем и убедились - действительно тормозит. Хотя по идее тормозить там было особенно нечему - в данном конкретном случае основной модуль должен был передать что-то очень простое, вроде локального времени на том сервере, где он работает.
Тут разработчики взяли в руки truss, и стали трассировать основной модуль системы (так как его исходников им не дали). И увидели, что тормоза происходят в момент вызова "fopen(tmpfile, "r")", где tmpfile - что-то вроде "/tmp/xyz.6787876"
Разработчики удивились, и пошли в "/tmp". Там они сделали "touch somefile". Елки, натурально тормозит на создании пустого файла. И "rm somefile" (удаление, стало быть) тоже тормозит. В логах никаких ошибок нет, по S.M.A.R.T. выходит, что винт жив-здоров, файловая система тоже без ошибок. Мистика какая-то ...
И тут кто-то случайно запустил "ls". И очень удивился, не увидев результата. То есть, вообще никакого результата. Даже более того - не увидев командного промпта. То есть, набираем ls, нажимаем ввод и тишина. Пять секунд тишина, десять - тишина, минута - тишина, 3 минуты - тишина ...
По прошествии 5-10 минут ls стал выдавать результат... Оказалось, что индусские авторы основного модуля системы не имел привычки удалять за собой временные файлы. И их накопилось в /tmp совершенно неприличное количество. Настолько неприличное, что обновление директории при создании нового файла занимало от нескольких до десятка секунд.
Разработчики запустили "xargs -i * | rm {}" и ушли с горя напиваться. С другой стороны - если бы не этот баг в чужом коде, фиг бы они нашли время для всех оптимизаций и рефакторинга.
Остается только догадываться, как это умудрялось работать в Серьезных Индустриальных Инсталляциях.
(no subject)
Date: 2007-04-25 08:49 pm (UTC)Но в той Серьёзной Индустриальной Инсталляции автоматически правился crontab солярки. С добавлением туда что-то типа find /tmp -mmin +10 :)))
(no subject)
Date: 2007-05-07 04:14 pm (UTC)(no subject)
Date: 2007-04-25 08:50 pm (UTC)Собственно, после телнета к модулю я уже стал подозревать нечто подобное, а после fopen /tmp/... всё стало ясно :)
(no subject)
Date: 2007-04-25 08:56 pm (UTC)Напарнику была задача настроить spamassing, точнее прочитать RTFM и довести его до ума, в итоге я полностью апгрейдил весь майл софт, бо он часть снес, а часть так обновил, что лучше бы снес.
(no subject)
Date: 2007-04-25 09:20 pm (UTC)там конечно все файлы раскиданы по подкаталогам и т. п., и всё же
приходится второй раз писать асинхронную удалялку, что странно
(no subject)
Date: 2007-04-25 11:24 pm (UTC)Почему так - не знаю.
(no subject)
Date: 2007-04-26 12:01 am (UTC)(no subject)
Date: 2007-04-26 06:06 am (UTC)Solaris -- это олд-скул UFS, в которой работа с каталогами и инодами -- sync (если система не смонтирована с async), и потому удаление 5000 файлов -- это порядка 15000 записей на диск (5000 раз каталог, 5000 раз битмап инодов, 5000 раз сами иноды -- счётчик уменьшить). Во FreeBSD там softupdates, которые сгруппируют это так, что останется гоооораздо меньше записей -- каталог скорее всего будет писатся один раз, битмап инодов тоже, ну и иноды будут, тут никуда не деться, но иноды, которые в одном блоке сидят будут одним куском писатся, а не ради каждого инода блок заново переписываться...
(no subject)
Date: 2007-04-26 06:10 am (UTC)(no subject)
Date: 2007-04-26 06:11 am (UTC)Кстати, я в своей оценке еще битмамп блоков забыл -- а это еще 1 запись на каждый файл минимум :)
(no subject)
Date: 2007-04-26 06:13 am (UTC)(no subject)
Date: 2007-04-26 06:13 am (UTC)(no subject)
Date: 2007-04-26 06:09 am (UTC)А вот XFS (с ирикса) или ZFS (с солярки, а теперь и с FreeBSD) пережёвывает такие каталоги как неифк нафик -- как-никак каталоги в б-три.
(no subject)
Date: 2007-04-26 06:09 am (UTC)Правда, я вот не могу сейчас сказать насчет больших каталогов, но вот большие файлы удаляются моментально на UFS и довольно долго на ext2. Например, кино - может удаляться секунд 3-5 на современном железе.
(no subject)
Date: 2007-04-26 06:10 am (UTC)(no subject)
Date: 2007-05-12 07:03 am (UTC)FS: NTFS
Удаление одного каталога с миллионом файлов с помощью команды RD - несколько часов. То, что GUI OS с такими объектами не работает вовсе, и вовсе не удивляет.
(no subject)
Date: 2007-04-25 09:23 pm (UTC)•
Date: 2007-05-04 12:36 pm (UTC)Re: •
Date: 2007-05-04 02:53 pm (UTC)(no subject)
Date: 2007-05-05 12:18 am (UTC)(no subject)
Date: 2007-05-05 09:27 am (UTC)(no subject)
Date: 2007-04-25 09:39 pm (UTC)Глупый вопрос - как под популярными OS (Linux, FreeBSD, Solaris) послушать ругань S.M.A.R.T.'а?
Гугль, сволочь, издевается.
(no subject)
Date: 2007-04-25 10:06 pm (UTC)# smartctl -l error /dev/sda
smartctl version 5.37 [i686-pc-linux-gnu] Copyright (C) 2002-6 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
=== START OF READ SMART DATA SECTION ===
SMART Error Log Version: 1
No Errors Logged
ну или -a, он там сразу выдаст все, что сможет.
(no subject)
Date: 2007-04-26 05:19 am (UTC)(no subject)
Date: 2007-05-05 02:45 pm (UTC)(no subject)
Date: 2007-05-12 04:40 am (UTC)индус по имени "Ражалпраграм Наджави"
Date: 2007-04-25 09:45 pm (UTC)[gram|work] Какой самый извращенный способ проверить в условии if () булевскую переменную ?
[gram|work] bool b;
[gram|work] b = false;
[gram|work] if (b == true){...}
[gram|work] Это децкий лепет
[gram|work] ИТАК, ПЕРВОЕ МЕСТО
[gram|work] Знакомый говорит что нашел только что в коде:
[gram|work] if (b.ToString().length < 5){...}
http://bash.org.ru/quote.php?num=66390
Re: индус по имени "Ражалпраграм Наджави"
Date: 2007-04-26 05:47 am (UTC)(no subject)
Date: 2007-04-25 10:51 pm (UTC)(no subject)
Date: 2007-04-25 10:53 pm (UTC)(no subject)
Date: 2007-04-25 10:54 pm (UTC)и какая фс?
(no subject)
Date: 2007-04-26 12:07 am (UTC)(no subject)
Date: 2007-04-26 01:15 am (UTC)(no subject)
Date: 2007-04-26 05:29 am (UTC)(no subject)
Date: 2007-04-26 05:50 am (UTC)(Если кто знает как бороться - буду очень рад.)
(no subject)
Date: 2007-04-26 06:27 am (UTC)(no subject)
Date: 2007-04-26 06:42 am (UTC)(no subject)
Date: 2007-04-26 06:54 am (UTC)Разве что написать батник и пускать его в шедулере.... или при перезапуске системы.
А Студия создаёт кучу временных файликов для компилятора или во время компилияции. И, вобще-то теоретически, она должна бы их сама и чистить за собой. Опять же, если её не "сваливать", а нормально закрывать.
•
Date: 2007-05-04 01:03 pm (UTC)(no subject)
Date: 2007-04-26 06:20 am (UTC)cd и ls не отдавали обратно консоль
ждал секунд 30
времени было в обрез и я списал все на глюки reiserfs
автор понял, какое гавно он написал и убил жену
себя только забыл
(no subject)
Date: 2007-04-26 06:49 am (UTC)(no subject)
Date: 2007-04-26 07:51 am (UTC)(no subject)
Date: 2007-04-26 09:16 am (UTC)(no subject)
Date: 2007-04-26 07:58 am (UTC)(no subject)
Date: 2007-05-04 09:31 pm (UTC)идейно. хотя у меня такое же было.... =)
Оффтоп...
Date: 2007-05-07 06:43 am (UTC)Нельзя ли рассказ небольшой получить, что и как _в действительности_ происходит? Спасибо :)
Дополнение про индусов
Date: 2007-05-07 02:04 pm (UTC)И вот теперь британским учёным (в моём лице) удалось приподнять завесу тайны:
(gdb) disassemble rxmrun rxmrun+50
Dump of assembler code from 0x40398cd0 to 0x40398d02:
... (не очень интересно) ...
0x40398ce9 <rxmrun+25>: push 30
0x40398ceb <rxmrun+27>: call 0x8054eb8 <sleep>
То есть кто-то из индусских жрецов Оракла просто написал
sleep (30);
Интересно бы посмотреть в его однопиксельные глаза и задать ему пару вопросов.
(c)http://vnaum.livejournal.com/9731.html (http://vnaum.livejournal.com/9731.html)
Commandline limit
Date: 2007-07-02 11:58 am (UTC)