запутался в производительности httpclient - PullRequest
0 голосов
/ 14 июля 2010

Я только начинаю писать простой веб-сканер, чтобы получить информацию о ссылках, которые мы получаем в нашей системе.Я использую httpclient 4.x.У меня около 100 потоков, запускающих извлечение ссылок и выполняющих запросы на них, они отлично работают в течение первых нескольких часов, а затем замедляются до визгливого сканирования.Я не уверен, правильно ли я настраиваю диспетчер соединений.

Вот код, который мне нужен для создания объекта httpclient.Кто-нибудь видел что-нибудь, что вызвало бы тревогу с этим блоком кода?Когда я останавливаю сервер и перезагружаю его, все становится снова как новый.Во время фазы, когда она работает медленно, память все еще выглядит нормально с постоянной скоростью 500 Кбайт на процесс, так что не похоже, что я теряю память.

HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, 5000);
ConnManagerParams.setMaxTotalConnections(httpParams, 200);
HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);

// set request params

httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
httpParams.setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");


SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 443));

final ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParams,schemeRegistry);

HttpClient httpClient = new DefaultHttpClient(cm, httpParams);

httpClient.getParams().setParameter("http.conn-manager.timeout", 10000L);
httpClient.getParams().setParameter("http.protocol.wait-for-continue", 10000L);

Я также использую этот код в потокечтобы очистить соединения с истекшим сроком, как указано в документации

final Runnable cleanUp = new Runnable() {
      public void run() { 

        cm.closeExpiredConnections();
        // Optionally, close connections
        // that have been idle longer than 30 sec
        cm.closeIdleConnections(30, TimeUnit.SECONDS);

      }
     };

ОБНОВЛЕНИЕ: я запускал визуальную ВМ в течение часа или около того, и вот график памяти для удаленного процесса, память теперь используется

http://img64.imageshack.us/f/screenshot20100714at204.png/

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Используйте VisualVM (также поставляется с JDK) и некоторое время следите за своим приложением с помощью JMX. Также установите плагин Visual GC, он предлагает внутреннюю часть того, что происходит с вашим GC (что может сильно замедлить работу приложения, если не хватает памяти).

Когда он замедляется, посмотрите на вкладку Threads, чтобы увидеть, как он выглядит, когда дело доходит до блокировки. Блокировка или недостаточно памяти (утечки памяти) должны быть проблемой в вашем случае.

Если вы хотите углубиться, я бы порекомендовал вам YourKit Java Profiler.

0 голосов
/ 14 июля 2010

Я бы также попытался настроить счетчик потоков, чтобы понять, имеет ли это какое-то значение.

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