LINUX.ORG.RU

как правильно скорость резать ?


0

0

Доброго дня и ночи!

пробовал так 

static int
limit_rate (struct request *req) 
{
  //  char *fwd_for = forwarded_for (req);
  u_int cli_spd_limit = 20 * 1024; // get_client_speed_limit (fwd_for);
  u_int expected = 1000000 * (double)req->r_bytes / (double)cli_spd_limit;
  
  printf ("bytes: %lu time: %lu expected %lu\n", req->r_bytes, req->r_time, 
	  expected);

  if (expected > req->r_time) 
    {
      sleep_usec (expected - req->r_time);
    }
}

...
      GET_TIME_SLICE(&t1);
      if ((nread = read (req->server_fd, buf, buf_size)) <= 0) 
	break;
      GET_TIME_SLICE(&t2);

      req->r_bytes = nread;
      req->r_time = t2 - t1;

      limit_rate (req);

out:
bytes: 1400 time: 111 expected 68359
sleep_usec, nsec: 67565520

но он как то сильно ошибается, вместо 20кб/с - 17 
Подскажите пожалуйста где я натупил. 

GET_TIME_SLICE - это gettimeofday
sleep_usec - nanosleep 
anonymous

а все, дошло :)

/* Due to scheduling, we probably slept slightly longer (or
         shorter) than desired.  Calculate the difference between the
         desired and the actual sleep, and adjust the next sleep by
         that amount.  */

static int sleep_diff = 0;

static int
limit_rate (struct request *req) 
{
  char *fwd_for = forwarded_for (req);
  u_int cli_spd_limit = 16 * 1024; 
  u_int d_time = req->r_time, d_bytes = req->r_bytes;
  u_int expected;
  
  if (fwd_for) {
    cli_spd_limit = get_client_speed_limit (fwd_for);
    get_client_speed (fwd_for, &d_time, &d_bytes);
  }
  
  expected = 1000000 * (double)d_bytes / (double)cli_spd_limit;
  
  //  printf ("bytes: %lu time: %lu expected %lu\n", req->r_bytes, req->r_time, expected);

  if (expected > d_time) 
    {
      u_int t1, t2;
      u_int slp = expected - d_time + sleep_diff;

      GET_TIME_SLICE (&t1);
      sleep_usec (slp);
      GET_TIME_SLICE (&t2);

      if ((t2 - t1) > expected - d_time) 
	{
	  //  printf ("slept slightly longer: %i\n", (t2 - t1) - slp);
	}
      sleep_diff = slp - (t2 - t1);
    }

  return 0;
}

halflife ★★
()
Ответ на: комментарий от halflife

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

anonymous
()
Ответ на: комментарий от anonymous

А ты попробуй файрволом http трафик резать, учитывая то что
часть может быть уже в кэше.

Эта штуковина стоит не у клиента а как парент для сквида. И не
брасает пакеты сверх лимита как делатся в QoS.

Еще пример, попробуй одновременно качать с 2 мест 8 потоками каждое и
еще новости читать

halflife ★★
()
Ответ на: комментарий от halflife

> А ты попробуй файрволом http трафик резать, учитывая то что
часть может быть уже в кэше.

PS
Самое главное забыл, резать надо "на лету" для отдельного
потока, как в WinGate

halflife ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.