Дисперсия Времени Отклика AppEngine
Я рассматриваю возможность использования AppEngine для развертывания webapp, который я разрабатываю. В рамках моего исследования платформы 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
normrequests все запросы которые принимают чем 500ms для того чтобы завершить latereqs-это все запросы, выполнение которых занимает более 500 мс failreqs - это любые, которые вызывают исключение ввода-вывода во время загрузки или если полученный контент не равен "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 и 1177ms по полной.
это сравнивается со следующим выводом из того же периода, работающего против того же сервлета на микро-экземпляре, работающем на 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 работает в "US East". Я не знаю, где Google запускает мой экземпляр AppEngine.
могу ли я сделать что-нибудь, чтобы улучшить согласованность времени отклика AppEngine или дисперсия, которую я вижу, нормальна для AppEngine?
2 ответов
"поздние" запросы, которые вы видите, связаны с тем, что App Engine создает новую среду выполнения Java для обработки вашего запроса. App Engine увеличивает количество экземпляров вашего приложения, которое работает по требованию, и запускает бездействующие экземпляры после некоторого периода бездействия.
Это поведение гораздо более заметно для приложений с низким трафиком, потому что даже отдельный пользователь может вызвать всплеск, который требует нового времени выполнения, и экземпляры, скорее всего, будут закрыты для бездействия. Как трафик в ваше приложение увеличивается, количество запросов на разогрев будет уменьшаться пропорционально трафику.