40/sec к 500/sec
Введение
Удивлено, названием? наилучшим образом, это
будет путешествие как мы треснули jinx scalability от
регулировать meagre 40 показателей в секунду до 500
показателей в секунду. Beware, большая часть из проблем,
котор мы смотрели на была прямо передней, поэтому испытанные люди
могли считать это излишним.
Содержание
* 1.0 где были мы?
1.1 Память ударяет небо
1.2 низкий обрабатывая тариф
1.3 Потеря данных:- (
1.4 Mysql вытягивает нас вниз
1.5 Медленное Web client
* дорога 2.0 к Nirvana
2.1 Контролируя память!
2.2 Модернизировать обрабатывая тариф
2.3 Что uh-uh потери данных?
2.4 Настраивая Queries Sql
2.5 Настраивая схима базы данных
2.5 Mysql помогает нам forge
ahead!
2.6 Более быстро... более быстро web
client
* главная идея 3.0
Где были мы?
Первоначально мы имели систему смогла вычислить по маштабу
только до 40 показателей /sec. Я смог даже вспомнить
обсуждение, о "должен быть идеально тарифом показателей? ".
Окончательно мы решили что 40/sec было идеально тарифом для
одиночного firewall. Так когда мы должны go out,
необходимо atleast поддержать 3 firewalls.
Следовательно мы решили что 120/sec будет идеально тарифом.
Я основаны на данных от нашего competitor(s) мы пришли к
заключению, они смогло поддержать вокруг 240/sec. Мы думали
оно было одобрено! по мере того как было нашим первым отпуском.
Потому что все конкуренты поговорили о числе firewalls он
поддержал но не на тарифе.
Память ударяет небо
Наша память всегда ударяла небо даже на
512MB! (исключение OutOfMemory) мы обвинили прятать в
тайнике cewolf(s) inmemory произведенного images.But,
котор мы не смогли избеубежать для длиной! Никакое дело
соединили ли мы клиента или не мы не использовали ударить небо в паре
максимума дней 3-4 дней плоско! Interestingly, это
было возпроизводимым когда мы послали данные на очень высоком
rates(then), вокруг 50/sec. Вы угадали их право,
unlimited буфер который растет до тех пор пока он не ударить
крышу.
Низкий обрабатывая тариф
Мы обрабатывали показатели на тарифе 40/sec.
Мы использовали навальное уточнение dataobject(s). Но
оно не дал предпологаемую скорость! Из-за этого мы начали
hoard данные в памяти resulting in память
hoarding!
Потеря Данных:- (
На высоких скоростях мы использовали пропустить много
packet(s). Мы показалось, что имели меньшюю потерю данных,
но то привело к в hog памяти. На некотором tweaking
для того чтобы ограничивать размер буфера мы начали иметь устоичивую
потерю данных около 20% на очень высоких тарифах.
Mysql вытягивает нас вниз
Мы смотрели на грубое время когда мы импортировали
архив журнала около 140MB. Mysql начало к hog,
вползать начатый машиной и иногда оно ровное остановленное
responding.Above все, мы начали получить timeout(s)
deadlock(s) и трудыов. Окончательн уменьшило отзывчивость
системы.
Медленное Web client
Здесь снова мы обвиняли число диаграмм, котор мы
показали в странице как bottleneck, игнорируя факт что были много
других факторов которые вытягивали систему вниз. Страницы
использовали принять 30 секунд к нагрузке для страницы с 6-8
диаграммами и таблицами после 4 дней на центров обработки информации
интернета.
Дорога К Nirvana
Контролируя Память!
Мы попытались одеть в предел размер буфера 10.000, но
он не сделал продолжает для длиной. Главная рванина в
конструкции была что мы предположили буфер вокруг 10000 будет
достаточным, т.е. мы были бы отростчатыми показателями прежде чем
буфер 10.1000 достигаемостей. Inline с принципом ",
котор что-то может пойти неправильно оно пойдет неправильно!"
оно пошл неправильно. Мы начали освободить данные.
Subsesquently, котор мы решили пойти с прятать в тайнике
плоского архива основанный, при котором данные были сброшены в плоский
архив и нагружены в базу данных использующ "данные по нагрузки
infile". Это было много времен более быстро чем навальная
вставка через водителя базы данных, котор вы могли также хотеть к
проверке некоторые по возможности оптимизирования с данными по
нагрузки infile. Это зафиксировало нашу проблему
увеличивать размер буфера сырцовых показателей.
Второй проблемой, котор мы смотрели на было увеличение
cewolf(s) в памяти пряча механизм в тайнике. невыполнением
обязательства она использовала "TransientSessionStorage" прячет
предметы в тайнике изображения в памяти, там показанное для того чтобы
быть некоторой проблемой в очищать вверх по предметам, even
after rerferences были потеряны! Так мы написали малую
вставку "FileStorage" хранят предметы изображения в местном
архиве. И послужил как и когда запрос приходит внутри.
Сверх того, мы также implmentated механизм ыборкы к
изображениям images(yborky перележалым более старым чем
10mins).
Другой интересный аспект, котор мы нашли здесь был что
сборник отброса имел самый низкий приоритет поэтому предметы созданные
для каждого показатели, трудно был очищен вверх. Здесь меньшяя
математика для того чтобы объяснить величину проблемы. Когда мы
получаем показатель журнала, котор мы создали objects(hashmap
~20, tokenized шнуры etc) так на тарифе 500/sec
для 1 второго, число предметов был 10,000(20*500*1).
Должно к тяжелому обрабатывая сборнику отброса никогда не имел
шанс к ыборке предметы. Настолько все, котор мы должны сделать
был небольшой tweak, мы как раз задало "null" к справкам
предмета. Voila! сборник отброса был никогда после
того как он попытан я угадывает; -)
Модернизировать обрабатывая тариф
Обрабатывая тариф был на meagre 40/sec
намеревается что мы смогли трудно выдержать даже малый outburst
показателей журнала! Управление памяти дало нам некоторое
solace, но фактическая проблема была с применением бдительных
фильтров над показателями. Мы имели вокруг 20 свойств для
каждого показателя, мы использовали искать для всех свойств. Мы
изменили вставку к спичке для тех свойств, котор мы имели критерии
для! Сверх того, мы также имели утечку памяти в бдительный
обрабатывать фильтра. Мы поддерживали косу выросла forever.
Так мы должны поддерживать предмет плоского архива сбрасывая для
избежания ре-re-parsing показателей сформировать предметы!
Сверх того, мы использовали сделать поступок искать для спички
по каждом из из свойство even when мы не имели никакие
бдительные критерии быть установленным.
Что uh-uh потери данных?
Как только мы зафиксировали память выдает в получать
данные т.е. сбрасывая в плоский архив, мы никогда не теряла данные!
В дополнение к тому мы должны извлечь пару излишних индексов в
сырцовой таблице для избежания накладных расходов пока сбрасывающ
данные. Мы индексы hadd для колонок смогли иметь максимум
3 по возможности значений. Фактическ сделало вставку более
медленным и не было полезно.
Настраивая Queries Sql
Вашими queries будут ваши ключи к
представлению. Как только вы начинаете пригвоздить вопросы, вы
увидите что вы могли даже де-normalizovat6 таблицы. Мы
сделали его! Здесь некоторые из ключевых learnings:
* Польза "анализирует таблицу" для того чтобы
определить как query mysql работает. Это передаст вам
проницательность около почему query медленн, т.е. использует ли
он правильно индексы, использует ли он развертку etc уровня
таблицы.
* Никогда рядки delete когда вы общаетесь с
огромными данными в заказе 50.000 показателей в одиночной
таблице. Всегда попытка для того чтобы сделать "таблицу падения"
как можно очень. Если не по возможности, то переконструируйте
вашу схиму, что ваше только way out!
* Избегите излишнего join(s), не будьте испуган
де-normalizovat6 (т.е. дублируйте значения колонки) избегите
join(s) как можно очень, они клонат вытянуть ваш query вниз.
Одним спрятанным преимуществом будет факт что они наводят
простоту в ваших queries.
* Если вы общаетесь с навальными данными, то всегда
польза "данные по нагрузки infile" там 2 варианты здесь, местная
и дистанционная. Используйте местное если mysql и
применение находятся в таком же remote пользы машины в противном
случае.
* Попытайтесь разделить ваши сложные queries в
2 или 3 более просто queries. Преимущества в этом подходе
что ресурс mysql не hogged вверх для всего процесса.
Клоните использовать временно таблицы. Вместо
использования одиночный query spans через 5-6 ставит на
обсуждение.
* Когда вы общаетесь с огромным количеством данных,
т.е. вы хотите к proces говорите 50.000 показателей или
больше в одиночной попытке query использующ предел к серийному
процессу показатели. Это поможет вам вычислить по маштабу
систему к новым высотам
* Всегда используйте более малое
transaction(s) вместо больших одних т.е. spanning через
таблицы "н". Это фиксирует вверх ресурсы mysql, которые
могли причинить несообразительность системы даже для просто
queries
* Используйте join(s) на колонках с
индексами или чужими ключами
* Обеспечьте что queries от поверхности
стыка потребителя имеют критерии или ограничьтесь.
* Также обеспечьте что колонка критериев
индексирована
* Не имейте numeric значение в критери
по sql в пределах quotes, потому что mysql делает
бросание типа
* используйте временно таблицы как можно очень, и
падайте она...
* Вставка select/delete будет двойным
замком таблицы... осведомленна...
* Позаботьтесь что вы не мучите базу данных
mysql с частотой ваших уточнений к базе данных. Мы имели
типичный случай, котор мы использовали сбросить к базе данных после
того как каждые 300 показателей. Так когда мы начали
испытать для 500/sec мы начали увидеть что mysql буквальн
волочило нас вниз. То когда мы осуществили что typicall на
тарифе 500/sec там будет "запрос данным по нагрузки infile"
каждая секунда к базе данных mysql. Так мы должны изменить
для того чтобы сбросить показатели после 3 минут rather
than 300 показателей.
Настраивая схима базы данных
Когда вы общаетесь с огромным количеством данных,
всегда обеспечивайте что вы разделили ваши данные. То будет
вашей дорогой к scalability. Одиночная таблица с lakhs
мнения 10 может никогда не вычислять по маштабу. Когда вы
предназначаете исполнить queries для рапортов. Всегда
имейте 2 уровня таблиц, сырцовых таблиц одного для фактические данные
и другого комплекта для tables(raporta таблицы которые
поверхности стыка потребителя запрашивают дальше!) Всегда
обеспечивайте что данные на ваших таблицах рапорта никогда не растут
за пределом. Упакуйте вас планируйте использовать оракула, вас
смогите try out разделять основанный на критериях. Но
несчастливо mysql не поддерживает то. Так мы сделать то.
Поддерживайте таблицу meta в вы имеете данные по коллектора
т.е. ставят на обсуждение для того чтобы look for, для
комплекта, котор дали времени критериев нормальн.
* Мы должны погулять через нашу схиму базы данных и
мы добавили для того чтобы добавить некоторые индексы, уничтожаем
некоторое и даже дублированное column(s) для того чтобы извлечь
дорогое join(s).
* Идти вперед мы осуществили то имея сырцовые
таблицы по мере того как InnoDB было фактическ накладными
расходами к системе, поэтому нас изменили ее к MyISAM
* Мы также пошли в объем уменьшения числа
рядков в статических таблицах, котор включили внутри соединяем
* Кажется, что причиняет NULL в
таблицах базы данных некоторое представление ударить, поэтому избегите
их
* Не имейте индексы для колонок позволяло
значения 2-3
* Кроссированныйа чек потребность для
каждого индекса в вашей таблице, они дорог. Если таблицы будут
проверки двойника InnoDB после этого их потребностью.
Потому что кажется, что принимают таблицы InnoDB вокруг
10-15 приурочивает размер таблиц MyISAM.
* Используйте MyISAM когда будет большинство,
то один из (выберите или вставка) queries. Если вставка и
отборные идут быть более после этого, то более лучшее иметь ее как
InnoDB
Mysql помогает нам forge ahead!
Настроьте вашего сервера mysql only after
вы точная настройка ваше queries/schemas и ваше Кодий.
Только после этого вы можете увидеть perceivable улучшение
в представлении. Здесь некоторые из параметров приходят в
сподручное:
* Используйте размер буферного запаса позволит ваши
queries исполнить более быстро --
innodb_buffer_pool_size=64M для InnoDB и использовать --
key-bufer-size=32M для MyISAM
* Ровные просто queries начали принять
больше времени чем предположено. Мы фактическ были озадачены!
Мы осуществили что кажется, что нагружает mysql индекс
любой таблицы, котор оно начинает ввести дальше. Так типично
случилось было, любой просто query к таблице с 5-10 рядками
приняло вокруг 1-2 secs. На более дальнеишем анализе
мы нашли что just before просто query, "слученное
infile данным по нагрузки". Это исчезло когда мы изменили
сырцовые таблицы к типу MyISAM, потому что размер буфера для
innodb и MyISAM 2 по-разному конфигурации.
для более configurable параметров см. здесь.
Конец: начните ваше mysql для того чтобы начать
с following вариантом -- журнал-owibka это включит вносить в
журнал ошибки
Более быстро... более быстро web client
Поверхностью стыка потребителя будет ключ к любому
продукту, специально восприниманная скорость страницы важне!
Здесь перечень разрешения и learnings могли прийти в
сподручное:
* Если ваши данные не идут изменить на мнение
3-5 минут, то более лучшее спрятать ваши страницы в тайнике
стороны клиента
* Клоните использовать ETC диаграмм
Iframe(s)for, котор внутреннее они дают восприниманную быстроту к
вашим страницам. Улучшайте все еще пользу основанный
javascript содержимый механизм нагрузки. Это что-то, котор
вы могли хотеть сделать когда вы будете иметь диаграммы мнения 3+
в такой же странице.
* Исследователь интернета показывает всю страницу
только когда все содержание получено от сервера. Так
целесообразно использовать iframes или javascript для
содержимой нагрузки.
* Никогда не используйте входы
multiple/duplicate архива css в html page.
Исследователь интернета клонит нагрузить каждый архив css
как отдельно вход и применяется на вполне странице!
Bottomline ваши queries и схима делает систему
более медленной! Исправьте они сперва и после этого обвините
базу данных!
См. Также
* Высокий класс исполнения Mysql
* Представление Query
* Объясните Query
* Оптимизируя Queries
* Настраивать InnoDB
* Настраивая Mysql
Категории: Анализатор Firewall | Представлением наклоняет эту страницу было last
modified 18:00, 31 -го август 2005.
- Ramesh-
Статья Источник: Messaggiamo.Com
Related:
» Seo Elite: New Seo Software!
» AntiSpywareBOT
» Reverse Mobile
» Error Nuker
Вебмастер получить html-код
Добавить эту статью на Вашем сайте прямо сейчас!
Вебмастер представить свои статьи
Не требуется регистрация! Заполните форму и ваша статья в Messaggiamo.Com каталог!