Havana преследуется Смертью

Данную историю внес Феликс Ли из Центра грид- вычислений Академии наук на Тайване.

Я только что обновил 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);

Производительность значительно выросла после удаления старых записей и моя новая инсталляция продолжает вести себя хорошо.