Данную историю внес Феликс Ли из Центра грид- вычислений Академии наук на Тайване.
Я только что обновил OpenStack с Grizzly на Havana 2013.2-2 с использованием репозитория RDO и все работало довольно хорошо— за исключением EC2 API.
Я заметил, что API страдал от тяжелой нагрузки и медленно отвечал
на определенные запросы EC2,например, такие как RunInstances
.
Вывод результатов из /var/log/nova/nova-api.log
в Havana:
2014-01-10 09:11:45.072 129745 INFO nova.ec2.wsgi.server [req-84d16d16-3808-426b-b7af-3b90a11b83b0 0c6e7dba03c24c6a9bce299747499e8a 7052bd6714e7460caeb16242e68124f9] 117.103.103.29 "GET /services/Cloud?AWSAccessKeyId=[something]&Action=RunInstances&ClientToken=[something]&ImageId=ami-00000001&InstanceInitiatedShutdownBehavior=terminate... HTTP/1.1" status: 200 len: 1109 time: 138.5970151
Этот запрос потребовал две минуты на выполнение, однако быстро выполнялся в другой сосуществующей инсталляции Grizzly, использующей точно такое же оборудование и настройку системы.
Вывод результатов из /var/log/nova/nova-api.log
в Grizzly:
2014-01-08 11:15:15.704 INFO nova.ec2.wsgi.server [req-ccac9790-3357-4aa8-84bd-cdaab1aa394e ebbd729575cb404081a45c9ada0849b7 8175953c209044358ab5e0ec19d52c37] 117.103.103.29 "GET /services/Cloud?AWSAccessKeyId=[something]&Action=RunInstances&ClientToken=[something]&ImageId=ami-00000007&InstanceInitiatedShutdownBehavior=terminate... HTTP/1.1" status: 200 len: 931 time: 3.9426181
Выполнив мониторинг системных ресурсов, я заметил значительное увеличение
потребления памяти при обработке данного запроса через EC2 API.
Я предположил, что работа с памятью не идет должным образом—
возможно, она не освобождается. Если API получает несколько подобных
запросов, потребление памяти быстро растет, пока в системе не заканчивается
оперативная память и начинается использование свопинга. Каждый узел имеет 48 ГБ
оперативной памяти и процесс "nova-api" может потребить ее все в течение
нескольких минут. Как только это происходит, вся система становится медленной и
непригодной к использованию пока я не перезапущу службу
nova-api
service.
Следовательно, я задался вопросом: что же изменилось в редакции Havana в EC2 API, что могло привести к тому что я наблюдаю. Является ли это ошибкой, или нормальным поведением, которое я должен теперь обойти?
После копания в коде Nova code, я отметил две области в
api/ec2/cloud.py
, потенциально влияющие на мою систему:
instances = self.compute_api.get_all(context, search_opts=search_opts, sort_dir='asc') sys_metas = self.compute_api.get_all_system_metadata( context, search_filts=[{'key': ['EC2_client_token']}, {'value': [client_token]}])
Поскольку моя база данных содержит много записей— более одного миллиона записей метаданных и более 300`000 записей экземпляров в сосотянии "deleted" или "errored"— каждая операция поиска занимает годы. Я решил почистить базу данных, предварительно создав архивную копию для резервного копирования и затем выполнив некоторые удаления при помощи клиента MySQL. Например, я выполнил следующие команды для удаления строк экземпляров, удаленных более года назад:
mysql> delete from nova.instances where deleted=1 and terminated_at < (NOW() - INTERVAL 1 YEAR);
Производительность значительно выросла после удаления старых записей и моя новая инсталляция продолжает вести себя хорошо.