2015-04-08 3 views
0

У меня есть простая java-программа, которая отправляет 10 000 HTTP-запросов серверу в параллельных потоках.HttpURLConnection: Отправка 10 000 запросов дает «Connection reset»

Многие из запросов в комплекте с успешным 200 OK кода ответа, но некоторые из запросов терпят неудачу со следующим сообщением:

java.net.SocketException: сброс подключения на java.net.SocketInputStream.read (SocketInputStream.java:196) в java.net.SocketInputStream.read (SocketInputStream.java:122) в java.io.BufferedInputStream.fill (BufferedInputStream.java:235) в java.io.BufferedInputStream.read1 (BufferedInputStream .java: 275) at java.io.BufferedInputStream.read (BufferedInputStream.java:334) в sun.net.w ww.http.HttpClient.parseHTTPHeader (HttpClient.java:689) в sun.net.www.http.HttpClient.parseHTTP (HttpClient.java:633) в sun.net.www.http.HttpClient.parseHTTP (HttpClient. Java: 660) в sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1324)

Мой код:

import java.io.*; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.DataOutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.util.*; 
import org.json.JSONException; 
import org.json.JSONObject; 
import org.json.JSONArray; 
import java.io.OutputStreamWriter; 
import java.io.DataOutputStream; 

public class CreateUsers { 

     public static void main(String[] args){ 
       System.out.println(Thread.currentThread().getName()); 

       for(int i=0; i<10000; i++){ 
         final int cnt = i; 
         new Thread("" + i){ 
           public void run(){ 
             try { 
               String url = "http://myurl.com"; //I use my actual server url here 
               URL object=new URL(url); 
               HttpURLConnection con = (HttpURLConnection) object.openConnection(); 
               con.setDoOutput(true); 
               con.setRequestMethod("POST"); 
               con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 

               JSONObject parent=new JSONObject(); 
               JSONObject all_users=new JSONObject(); 
               all_users.put("user_name", "abc"); 
               all_users.put("email", "test"+cnt+"@test.com"); 

               JSONArray users = new JSONArray(); 
               users.put(all_users); 
               parent.put("users", users); 
               OutputStream os = con.getOutputStream(); 
              os.write(parent.toString().getBytes("UTF-8")); 
               os.close(); 

               int responseCode = con.getResponseCode(); 
               System.out.println("\nSending 'POST' request to URL : " + url); 
               System.out.println("Response Code : " + responseCode); 
con.disconnect(); 

             } 
             catch (Exception e) {e.printStackTrace();} 

           } 
         }.start(); 
       } 
     } 
} 

UPDATE

Поскольку ответы здесь указывают на факс t, что мой сервер прерывает входящие попытки, я хотел бы знать, какие настройки сервера мне нужно сделать, чтобы смоделировать 10 000 входящих запросов.

Мой сервер представляет собой экземпляр ecazon ec2, работающий на ubuntu, apache tomcat 7, 30G RAM, 4 процессора.

ответ

4

Вы в основном проводите атаку типа «отказ в обслуживании» на машине. Веб-сервер не может обрабатывать много одновременных подключений и должен прервать некоторые входящие попытки.

Если вы намереваетесь написать такой инструмент, он работает нормально. В противном случае, пожалуйста, укажите, что вы на самом деле пытаетесь выполнить.

+0

Целевой сервер - это мой сервер. Я загружаю сервер с помощью 10K параллельных запросов. Я хочу, чтобы мой целевой сервер мог обслуживать каждый из 10K запросов на запись. Какие настройки следует делать на этом сервере, чтобы выполнять эти запросы, а не сбросить соединение? – Ninja

+3

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

+0

Я задал этот вопрос в качестве ответа на ваш ответ, что исключение, скорее всего, связано с прерыванием соединений с сервером. – Ninja

1

Если вы действительно отправляете 10.000 запросов, я подозреваю, что сервер, обрабатывающий ваши запросы, отказывается от некоторых запросов, потому что он слишком занят или сталкивается с каким-либо другим исключением при обработке вашего запроса.

+0

Я загружаю тестирование своего сервера, поэтому отправляю запросы 10K. Я буду добавлять больше кода функции run() для имитации 10K параллельных HTTP-запросов, поражающих мой сервер. – Ninja

+0

@Ninja: Тестирование 10k одновременных подключений с одного компьютера может не соответствовать сценарию одновременного подключения в реальном мире 10k ... Может быть, распределенный тест JMeter сократит его лучше? Вы можете медленно разгонять его, чтобы посмотреть, где он начнет сгибаться – GPI

Смежные вопросы