?

Log in

No account? Create an account
dump -0f - /dev/mind
Я знаю Haskell, OCaml, GSM, эндофункторы и много других страшных слов
Как понять, что в коде много багов? - Это когда фиксишь их нечаянно ... 
25th-Apr-2007 11:42 pm
Много лет тому назад, в одной далекой галактике войска Императора собирали в космосе очередную Звезду Смерти. Нет, это из другой баечки. Начнем еще раз ...
Много лет тому назад, в одно софтверной компании группа разработчиков работала над очередным Скучным Индустриальным Проектом, который к ним за-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 {}" и ушли с горя напиваться. С другой стороны - если бы не этот баг в чужом коде, фиг бы они нашли время для всех оптимизаций и рефакторинга.

Остается только догадываться, как это умудрялось работать в Серьезных Индустриальных Инсталляциях.
Comments 
25th-Apr-2007 08:49 pm (UTC)
Что-то ужасно знакомое :)
Но в той Серьёзной Индустриальной Инсталляции автоматически правился crontab солярки. С добавлением туда что-то типа find /tmp -mmin +10 :)))
7th-May-2007 04:14 pm (UTC)
Главное пробел между "/" и "tmp" не поставить - ато мы это тут уже проходили :)
25th-Apr-2007 08:50 pm (UTC)
Ох, отличная история. Спасибо, порадовали.
Собственно, после телнета к модулю я уже стал подозревать нечто подобное, а после fopen /tmp/... всё стало ясно :)
25th-Apr-2007 08:56 pm (UTC)
Знакомо.

Напарнику была задача настроить spamassing, точнее прочитать RTFM и довести его до ума, в итоге я полностью апгрейдил весь майл софт, бо он часть снес, а часть так обновил, что лучше бы снес.
25th-Apr-2007 09:20 pm (UTC)
я уже второй раз в жизни оказываюсь искренне удивлён, обнаружив, что операция удаления файла -- совершенно не пренебрежительно дешевая. то есть удаление списка из 10 тысяч файлов на (правда, загруженном) сервере занимает например минут тридцать пять

там конечно все файлы раскиданы по подкаталогам и т. п., и всё же

приходится второй раз писать асинхронную удалялку, что странно
25th-Apr-2007 11:24 pm (UTC)
Зависит от ОС/ФС. Удаление на ext2 (линукс) - дорогая операция, на UFS (FreeBSD) - дешевая.

Почему так - не знаю.
25th-Apr-2007 09:23 pm (UTC)
меня тоже прикололо- менеджер для mp3 плеера iRiver версии 2.x - 1,5мегабайта, версии 3.x- уже 30 (!), полуось столько места занимает. Функциональности- полторы функции, косяков- больше, чем функционала... Блин. :(( И качать по дайлапу надо было без докачки. 30 мег, ага. Не то, чтоб я индусов не люблю...:)))
4th-May-2007 12:36 pm (UTC) -
А это ребята тупо, чтобы не париться, завернули внутрь него инсталлятор netfx 1.1. По-моему, это я его с таким результатом развинчивал.
Re: • - Anonymous - Expand
(no subject) - Anonymous - Expand
25th-Apr-2007 09:39 pm (UTC)
В логах никаких ошибок нет, по S.M.A.R.T. выходит, что винт жив-здоров, файловая система тоже без ошибок.

Глупый вопрос - как под популярными OS (Linux, FreeBSD, Solaris) послушать ругань S.M.A.R.T.'а?
Гугль, сволочь, издевается.
25th-Apr-2007 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, он там сразу выдаст все, что сможет.
25th-Apr-2007 09:45 pm (UTC) - индус по имени "Ражалпраграм Наджави"
[gram|work] про индийский код
[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
26th-Apr-2007 05:47 am (UTC) - Re: индус по имени "Ражалпраграм Наджави"
уже испорченный телефон пошел :)"if (b.ToString().Length < 5){...}" C#.Net однако.
25th-Apr-2007 10:51 pm (UTC)
Зачотная история
25th-Apr-2007 10:53 pm (UTC)
нда. Особенно, если учесть, что в солярке /tmp обычно в памяти (swap), наедаться оно должно было в мелкие дребезги.
25th-Apr-2007 10:54 pm (UTC)
а сколько всё таки там файлов было? или не считали?
и какая фс?
26th-Apr-2007 12:07 am (UTC)
А в Серьезных Индустриальных Инсталляциях наверное машину бутили раз в недельку-другую, вот /tmp и чистился.
26th-Apr-2007 01:15 am (UTC)
а олдскульный гуй не тормозил что ли?
26th-Apr-2007 05:29 am (UTC)
На злобу дня, ибо сам сейчас проект что индусы кодили фиксаю :-(
26th-Apr-2007 05:50 am (UTC)
Занятно. Прочитал и зачесались руки написать чистилку $(Temp) под виндой, зараза VS2005 создает там кучу файлов. вида: "_CL_2b2d40dcgl".
(Если кто знает как бороться - буду очень рад.)
26th-Apr-2007 06:27 am (UTC)
Ну вот ты сам и ответил ;) -- переодически чистить...
26th-Apr-2007 06:20 am (UTC)
не далее как в прошлую пятницу была такая же кака
cd и ls не отдавали обратно консоль
ждал секунд 30
времени было в обрез и я списал все на глюки reiserfs
автор понял, какое гавно он написал и убил жену
себя только забыл
Page 1 of 2
<<[1] [2] >>
This page was loaded Oct 23rd 2019, 7:47 am GMT.