Дисперсия времени отклика AppEngine - PullRequest
8 голосов
/ 25 ноября 2010

Я рассматриваю возможность использования AppEngine для развертывания разрабатываемого веб-приложения. В рамках моего исследования платформы AppEngine я проверил время ответа на простые запросы. Для этого я написал простой сервлет PING:

@SuppressWarnings("serial")
public class Ping extends HttpServlet
{
  @Override
  public void doGet(@SuppressWarnings("unused") HttpServletRequest xiReq,
                    HttpServletResponse xiResp)
                    throws IOException
  {
    xiResp.setContentType("text/plain");
    xiResp.getWriter().println("PONG");
  }
}

Затем я написал Java-программу, которая каждую секунду отправляет запрос сервлету и сколько времени занимает его выполнение. Для извлечения содержимого страницы используется следующий код.

private static String getPageContent(String url) throws IOException {
  String result = null;
  URL reqURL = new URL(url);
  URLConnection connection = reqURL.openConnection();
  connection.setConnectTimeout(30 * 1000);
  connection.setReadTimeout(30 * 3000);
  InputStream webStream =  connection.getInputStream();
  BufferedReader reader = new BufferedReader(new InputStreamReader(webStream));
  result = reader.readLine();
  reader.close();
  return result;
}

Каждые 3 минуты мой скрипт монитора выводит данные в следующем формате:

date,num_reqs,num_failedreqs,avg_reqtime,num_normreqs,avg_normreqtime,num_latereqs,avg_latereqtime

норм-запросы - это все запросы, выполнение которых занимает менее 500 мс latereqs - это все запросы, выполнение которых занимает более 500 мс failreq - это любые, которые выдают исключение ввода-вывода во время загрузки, или если полученный контент не равен «PONG»

Мой вывод за последние ~ 20 минут выглядит следующим образом:

Thu Nov 25 10:04:01 GMT 2010,300,0,186,295,171,5,1093
Thu Nov 25 10:09:28 GMT 2010,300,0,191,292,173,8,842
Thu Nov 25 10:14:52 GMT 2010,300,0,184,295,167,5,1177
Thu Nov 25 10:20:15 GMT 2010,300,0,182,294,168,6,876
Thu Nov 25 10:25:46 GMT 2010,300,0,172,298,167,2,827

Это показывает, что в каждом 5-минутном периоде имеется от 2 до 8 «поздних» запросов, для выполнения которых требуется в среднем от 827 до 1177 мс.

Это сравнивается со следующими выходными данными того же периода, запущенного для того же сервлета на микроэкземпляре, работающем в Amazon EC2.

Thu Nov 25 10:03:53 GMT 2010,300,0,177,300,177,0,0
Thu Nov 25 10:09:20 GMT 2010,300,0,179,299,178,1,583
Thu Nov 25 10:14:43 GMT 2010,300,0,176,299,175,1,545
Thu Nov 25 10:20:07 GMT 2010,300,0,176,299,175,1,531
Thu Nov 25 10:25:37 GMT 2010,300,0,181,298,178,2,669

Это показывает гораздо меньшее количество "поздних" запросов, а время ответа на эти медленные запросы намного меньше.

Я делаю свои запросы с сервера, расположенного в Великобритании. Мой экземпляр Amazon EC2 работает на "Востоке США". Я не знаю, где Google запускает мой экземпляр AppEngine.

Могу ли я сделать что-нибудь, чтобы улучшить согласованность времени отклика AppEngine или я вижу нормальное отклонение для AppEngine?

Ответы [ 2 ]

3 голосов
/ 26 ноября 2010

«Поздние» запросы, которые вы видите, связаны с тем, что App Engine запускает новую среду выполнения Java для обработки вашего запроса. App Engine увеличивает количество экземпляров вашего приложения, которое оно запускает по требованию, и сокращает количество неактивных экземпляров после некоторого периода бездействия.

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

0 голосов
/ 13 января 2011

Насколько я могу судить, дисперсия - это просто свойство сети, которую использует Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...