У нас есть веб-сайт, работающий на 2 серверах: 1 сервер базы данных, 1 веб-сервер. Насколько мы понимали, у нас было 4 ГБ ОЗУ на веб-сервере и 8 ГБ ОЗУ на сервере базы данных.
Сайт интенсивно использует базу данных с множеством запросов на каждой странице.
Примечание: недавно мы обнаружили, что сервер базы данных работает 32-разрядным, что, по нашему мнению, означает, что все 8 ГБ ОЗУ не могут быть использованы. Итак, предположим, что 4 ГБ - это все, что есть на сервере базы данных.
Сайт работает не оптимально, и мы пытаемся понять, как его настроить.
В настоящее время он близок к пиковому трафику, и это то, как наш сервер загружает / память:
Наш веб-сервер: загрузка сервера 0,49 (4 процессора) Используемая память 59,72% (2 471 180 из 4 137 968) Использовано подкачки 0,01% (120 из 20 96440)
Наш сервер базы данных: загрузка сервера 2,8 (8 ЦП) Используемая память 10,76% (893 004 из 8 300 376) Используемая подкачка 0,01% (116 из 2096440)
Вот вопрос (ы):
Означает ли это некоторую неэффективность, что наш сервер базы данных работает с нагрузкой 2,8, а объем памяти составляет только 10% (даже если ОЗУ всего 4 ГБ, это все еще только 20%)?
Если да, то следует ли это решить в файле my.cnf?
Как лучше относиться к памяти? Что лучше: «используемая память» должна быть выше, указывая на то, что она использует ресурсы, или лучше быть ниже? Очень низкие 10% указывают на эффективность или ее отсутствие?
Заранее спасибо, как всегда, за любую информацию.
Это не дает прямого ответа на ваш вопрос, но если у вас не закончилась оперативная память (свопинг) и ваши средние значения нагрузки неплохие (они не кажутся такими), то ваши проблемы, скорее всего, связаны с уровнем приложения, а не с оборудованием (за исключением любые другие проблемы с оборудованием, такие как iSCSI, NAS, сетевые проблемы)
Вы провели тщательную оптимизацию базы данных? Как долго выполняются ваши запросы?
Вы можете выяснить это, отслеживая, какие запросы выполняются чаще всего, регистрируя медленные запросы (например, запросы, которые занимают более 2 секунд) и используя обильные EXPLAIN
операторы, чтобы увидеть планы выполнения ваших запросов. Дело в том, что оперативная память вам не очень поможет, если ваши запросы выполняют полное сканирование таблиц по большим объемам неупорядоченных данных, а не просто поиск по индексу, загруженному в оперативную память.
Вы также можете помочь, сняв загрузку запросов с сервера из внешнего интерфейса ... например, используя memcached.
В Интернете есть масса ресурсов для оптимизации баз данных, добавления индексов и т. Д.
Надеюсь, что это помогает и удачи!
[..] предположим, что 4 ГБ - это все, что находится на сервере базы данных [..] Используемая память 10,76% (893 004 из 8 300 376) [..]
Очевидно, вы используете 32-битное Bigmem-Kernel, которое адресует все 8 ГБ.
[..] сервер базы данных работает с нагрузкой 2,8
Вы проверяли, возникает ли нагрузка на ваш сервер БД из-за ожидания ввода-вывода? Мне кажется, ваша система достаточно мощна в отношении процессоров и оперативной памяти, но может страдать от медленной подсистемы хранения.
Что показывает top для параметра% wa в строке CPU?
Загрузка 2,8 на 8-процессорный сервер не представляет особых проблем; Хотя нагрузка выше 8.
В любой базе данных вам нужно, чтобы по крайней мере все ваши индексы умещались в ОЗУ, а также были доступны некоторые другие для других задач MySQL и кэширования часто используемых данных.
Возможно, вам придется увеличить некоторые значения в my.cnf, в зависимости от того, используете ли вы таблицы InnoDB, таблицы MyISAM или оба вида.
Вы действительно не должны бояться позволить MySQL съесть больше оперативной памяти, если это необходимо, в конце концов, это выделенный сервер базы данных.
Следующий запрос должен дать вам размер индекса для данной базы данных.
SELECT CONCAT( ROUND( SUM( index_length ) / ( 1024 *1024 ) , 2 ) , ' MB' ) AS 'Index Size' FROM information_schema.TABLES WHERE table_schema LIKE 'dbname'