Увеличение производительности mysql

Без преувеличения можно сказать что основой быстродействия mysql является наличие необходимых индексов над таблицами и наличие достаточного объема оперативной памяти для вмещения этих индексов.

Понять насколько эффективно происходит кэширование индексов в оперативной памяти можно выполнив запрос:

mysql> show status LIKE "Key%";
+------------------------+------------+
| Variable_name          | Value      |
+------------------------+------------+
| Key_blocks_not_flushed | 0          | 
| Key_blocks_unused      | 1256135    | 
| Key_blocks_used        | 458764     | 
| Key_read_requests      | 8684644670 | 
| Key_reads              | 695044     | 
| Key_write_requests     | 20732504   | 
| Key_writes             | 7800079    | 
+------------------------+------------+
7 rows in set (0.00 sec)

Соотношение показателей Key_reads (операция чтения с диска) и Key_read_requests (запросов к индексам) показывает достаточно ли отведено памяти для сохранения наиболее употребимых индексов. Соотношение 1/10000 как в этом примере свидетельствует о очень качественной работе буфера ключей. Только каждый 10000 запрос вызывает физическую операцию чтения файла индекса с диска. Если соотношение хуже чем 1/100 то нужно произвести настройку mysql для увеличения объема памяти отведенной под буферизацию индексов. Вот пример где под буфер индексов отводится 2 гигабайта памяти.

/etc/my.cnf:

[mysqld]
max_connections=500
key_buffer_size=2048M
...

Значение параметра key_buffer_size нужно подбирать исходя их объема дискового пространства занимаемого файлами индексов. В документации рекомендуется устанавливать его в размере 25% от объема RAM имеющейся на сервере. Но лучше исходить из реальной потребности конкретного сервера с конкретными базами данных и экспериментально подобрать значение дающее оптимальное соотношение показателей Key_reads / Key_read_requests.

Скрипт для защиты от прожорливых ботов, валящих сервер

В последнее время почти каждая банда вебмастеров считает нужным сделать свой поисковик. Хороших программеров на все поисковики не хватает поэтому их поделия тупо валят сервера. Причем представляться они могут разнообразными юзерагентами, ходить с кучи адросов и даже юзать прокси. При ручном просмотре логов таких ботов можно заметить, но задача автоматизации их отлова в общем случае еще не решена. Обозначенная проблема актуальна для сайтовладельцев, что было озвученно в блоге Alexf .

Можно предположить что такие боты будут есть только HTML документы, а не js/css/gif/… В тоже время браузер обычного юзера помимо самого документа продергивает css и картинки. Юзеры с отключенными картинками и яваскриптами пользы не приносят (ибо рекламу не видят) и ничего страшного если при назойливом обращении к серверу их тоже посчитают ботами.

Тоесть для отлова свежих ботов нужен скрипт который читает конец лога (например 100 секунд) ищет подсети с которых взяли много (например больше 5) html документов и мало (непример меньше 10%) css/картинок. Такие подсети режутся фаирволом до амнистии (например на 10 минут). Если после амнистии подсеть опять валит сервер, то она снова уходит в бан.

На своих FreeBSD серверах я использую следующий скрипт:

Читать далее