TCP передача в Java очень медленная - PullRequest
0 голосов
/ 07 марта 2011

Я делаю программу для насыщения ссылки для тестирования производительности в моей сетевой лаборатории, я пробовал разные вещи, от изменения буферов отправки и получения, создания файла и его чтения, создания длинного массива и отправки его через сокет до конца.сразу: OutputStream.write (byte [])

Массив имеет длину 1000000 позиций. Когда я снимаю сетевой трафик, согласно анализатору, пакеты имеют «Данные (1460 байт)», которые заставляют меня выбратьчто я не посылаю байт за байтом.

Используемая полоса пропускания составляет около 8% от 100 Мбит / с.

Я публикую соответствующий код, так как между клиентом и сервером есть какое-то взаимодействие, которое я используюНе думаю, что это уместно:

Клиент:

int car=0;
do {
    car=is.read();
    //System.out.println(car);
    contador++;
} while(car!=104);

Server:

byte dades[]=new byte[1000000];
FileInputStream fis=null;
try {
    FileOutputStream fos = new FileOutputStream("1MB.txt");
    fos.write(dades);
    fos=null;
    File f = new File("1MB.txt");
    fis = new FileInputStream(f);
    step=0;
    correcte=true;
    sck = srvSock.accept();
    sck.setSendBufferSize(65535);
    sck.setReceiveBufferSize(65535);
    os = sck.getOutputStream();
    is = sck.getInputStream();
}

...

BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(dades);
for(int i=0;i<100;i++) {
    os.write(dades);
}

В этом случае я использовал последнюю идею: создать файл с массивом байтов на миллион позиций, а затем прочитал этот файл иЗаписать в сокет, до этой идеи я отправлял байтовый массив.

Еще одна вещь, которая заставляет меня поверить, что это не побайтовая передача, это то, что вВ компьютере с базовым ядром клиент использует 25% ЦП и использует около 8% пропускной способности, а на старом компьютере с одноядерным процессором (AMD Athlon) он использует 100% ЦП и всего 4% пропускной способности.Сервер не так сильно загружает процессор.

Есть идеи ???Я чувствую себя немного потерянным сейчас ...

Спасибо !!!

1 Ответ

2 голосов
/ 07 марта 2011

Возможно, это связано с тем, что клиент читает данные побайтно, что может заставить алгоритм управления потоком ограничивать пропускную способность передачи:

int car=0;
do {
    car=is.read();
    //System.out.println(car);
    contador++;
} while(car!=104);

Попробуйте вместо этого прочитать данные в массив или используйте BufferedInputStream:

byte[] buf = new byte[65536];
int size = 0;
boolean stop = false;

while (!stop && (size = is.read(buf)) != -1) {
    for (int i = 0; i < size; i++) {
        if (buf[i] == 104) {
            stop = true;
            break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...