Как делают Вас ограничение скорости операция IO?

Feature.WRITE_BIGDECIMAL_AS_PLAIN установить это для вашего объекта Mapper

5
задан blackwing 18 September 2008 в 17:58
поделиться

7 ответов

На прикладном уровне (использующий сокет Беркли разрабатывают API) Вы просто наблюдаете часы и читаете или данные записи на уровне, в котором Вы хотите ограничить.

Если Вы только считаете 10 Кбит/с в среднем, но источник отправляет больше, чем это, то в конечном счете все буферы между ним и Вы заполнитесь. TCP/IP допускает это, и протокол примет меры, чтобы отправитель замедлился (на прикладном уровне, вероятно, все, что необходимо знать, то, что с другой стороны, блокируя вызовы записи заблокируется, неблокирование записей перестанет работать, и асинхронные записи не завершатся, пока Вы не считали достаточно данных для разрешения его).

На прикладном уровне можно только быть приблизительными - Вы не можете гарантировать жесткие пределы такой как "не больше, чем, 10 Кбит передадут данную точку в сети в любую секунду". Но если Вы отслеживаете то, что Вы получили, можно разобраться в среднем числе в конечном счете.

16
ответ дан 18 December 2019 в 07:12
поделиться

Принимая сетевой транспорт, на основе TIP/IP, Пакеты отправляются в ответ на пакеты ACK/NACK, идущие другим путем.

Путем ограничения уровня пакетов, подтверждающих получение входящих пакетов, Вы в свою очередь уменьшите уровень, на котором отправляются новые пакеты.

Это может быть немного неточно, таким образом, его возможно оптимальный, чтобы контролировать скорость передачи в нисходящем направлении и скорректировать показатель отклика адаптивно, непока это не падает в удобном пороге. (Это произойдет действительно быстрое однако, Вы отправляете десятки acks в секунду),

4
ответ дан 18 December 2019 в 07:12
поделиться

Это похоже при ограничении игры определенным числом кадр/с.

extern int FPS;
....    
timePerFrameinMS = 1000/FPS;

while(1) {
time = getMilliseconds();
DrawScene();
time = getMilliseconds()-time;
if (time < timePerFrameinMS) {
   sleep(timePerFrameinMS - time);
}
}

Таким образом, Вы удостоверяетесь, что игровая частота обновления будет на уровне большей части кадр/с. Таким же образом DrawScene может быть функцией, используемой для нагнетания байтов в поток сокета.

1
ответ дан 18 December 2019 в 07:12
поделиться

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

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

Если Вы действительно хотите к только для чтения так много данных за один раз, можно сделать что-то вроде этого:

ReadFixedRate() {
  while(Data_Exists()) {
    t = GetTime();
    ReadBlock();
    while(t + delay > GetTime()) {
      Delay()'
    }
  }
}
1
ответ дан 18 December 2019 в 07:12
поделиться

Как другой сказали, ядро ОС справляется с трафиком, и Вы просто читаете копию данных из памяти ядра. Для грубого ограничения уровня всего одного приложения необходимо задержать чтения данных и позволить входящим пакетам буферизовать в ядре, которое в конечном счете замедлит подтверждение входящих пакетов и уменьшит уровень на том одном сокете.

Если Вы хотите замедлить весь трафик к машине, необходимо пойти и скорректировать размеры входящих буферов TCP. В Linux Вы влияли бы на это изменение путем изменения значений в/proc/sys/net/ipv4/tcp_rmem (размеры буфера памяти чтения) и другие tcp_* файлы.

0
ответ дан 18 December 2019 в 07:12
поделиться

wget, кажется, управляет им с - опция предельного уровня. Вот из страницы справочника:

Обратите внимание, что Wget реализует ограничение путем сна соответствующего количества времени после того, как сеть считала, что занял меньше времени, чем указанный уровнем. В конечном счете эта стратегия заставляет передачу TCP замедляться приблизительно к указанному уровню. Однако это может занять время для этого баланса, который будет достигнут, не удивляйтесь, если ограничение уровня не работает хорошо с очень маленькими файлами.

0
ответ дан 18 December 2019 в 07:12
поделиться

Добавить к ответу Branan:

Если Вы добровольно ограничите скорость чтения в конце получателя, то в конечном счете очереди заполнятся в обоих концах. Затем отправитель или заблокируется в отправлять () вызов или ответит от отправления () на звонок с sent_length меньше, чем ожидаемая длина, переданная отправлению () вызов.

Если отправитель не будет готов иметь дело с этим случаем путем сна и попытки снова послать то, что не вписалось в буферы ОС, то Вы будете, заканчивая иметь проблемы соединения (отправитель может обнаружить это поскольку ошибка) или проигрывающие данные (отправитель может невольно отбросить данные не вписанный буферы ОС).

0
ответ дан 18 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: