Solución de detección de velocidad de red de iOS

antecedentes

Para hacer estrategias comerciales más detalladas basadas en las condiciones de la red, se necesita un conjunto de soluciones de detección de velocidad de la red para evaluar las condiciones actuales de la red al menor costo posible. Por lo tanto, esperamos que los datos de detección provengan de solicitudes de red anteriores. , en lugar de gastar recursos en solicitudes de red para evaluar con precisión.

Cálculo del Índice

Generalmente, el RTT se utiliza como el principal índice de evaluación de la velocidad de la red. Después de obtener lotes de valores de RTT de solicitudes históricas, ¿cómo calcular un valor de RTT objetivo más preciso?

Las variables que afectan el valor de RTT son principalmente:

  1. Las condiciones de la red cambiarán con el tiempo;
  2. Las solicitudes provienen de diferentes servidores, el rendimiento es diferente y se ven fácilmente afectadas por los datos de cola larga;

Primero consulte el código fuente nqe de Chrome: chromium.googlesource.com/chromium/sr…

diseño de peso

Después de consultar el código fuente relevante, se encuentra que el valor RTT de la solicitud histórica se asociará con un peso para el cálculo final, y se encuentra la lógica central para calcular el peso RTT:

void ObservationBuffer::ComputeWeightedObservations(
    const base::TimeTicks& begin_timestamp,
    int32_t current_signal_strength,
    std::vector<WeightedObservation>* weighted_observations,
    double* total_weight) const {
…
    base::TimeDelta time_since_sample_taken = now - observation.timestamp();
    double time_weight =
        pow(weight_multiplier_per_second_, time_since_sample_taken.InSeconds());

    double signal_strength_weight = 1.0;
    if (current_signal_strength >= 0 && observation.signal_strength() >= 0) {
      int32_t signal_strength_weight_diff =
          std::abs(current_signal_strength - observation.signal_strength());
      signal_strength_weight =
          pow(weight_multiplier_per_signal_level_, signal_strength_weight_diff);
    }

    double weight = time_weight * signal_strength_weight;复制代码

Se puede observar que el peso proviene principalmente de dos aspectos:

  1. Peso de la señal: cuanto mayor sea la diferencia de la intensidad de la señal actual, menor será el valor de referencia del valor RTT;
  2. Peso del tiempo: cuanto más largo sea el valor RTT desde el tiempo actual, menor será el valor de referencia;

Este proceso puede reducir el impacto de las condiciones de la red que cambian con el tiempo.

diseño de vida media

Cuando se calculan los dos pesos, pow(衰减因子, diff)se usa el cálculo, entonces, cómo obtener este "factor de atenuación", tome el factor de atenuación de tiempo como ejemplo:

double GetWeightMultiplierPerSecond(
    const std::map<std::string, std::string>& params) {
  // Default value of the half life (in seconds) for computing time weighted
  // percentiles. Every half life, the weight of all observations reduces by
  // half. Lowering the half life would reduce the weight of older values
  // faster.
  int half_life_seconds = 60;
  int32_t variations_value = 0;
  auto it = params.find("HalfLifeSeconds");
  if (it != params.end() && base::StringToInt(it->second, &variations_value) &&
      variations_value >= 1) {
    half_life_seconds = variations_value;
  }
  DCHECK_GT(half_life_seconds, 0);
  return pow(0.5, 1.0 / half_life_seconds);
}
复制代码

De hecho, se trata de diseñar una vida media y calcular el "factor de atenuación por segundo", por ejemplo, si la diferencia entre un valor RTT y el tiempo actual es de 60 segundos, el peso decae a la mitad del valor inicial. Pensándolo más detenidamente, se pueden sacar dos conclusiones:

  1. En el mismo nivel de valor RTT histórico, cuanto menor sea la vida media, mayor será la confiabilidad, porque cuanto más cerca esté del estado actual de la red;
  2. Bajo la misma vida media, cuanto mayor sea la magnitud del valor RTT histórico, mayor será la credibilidad, porque se suavizarán más diferencias de rendimiento del servidor;

Entonces, yendo un paso más allá, la vida media se puede ajustar de acuerdo con la magnitud del valor histórico de RTT para encontrar un equilibrio entre ellos.

Diseño de algoritmos de ponderación

Cómo calcular el peso después de obtener el peso, lo más probable es que pensemos en el algoritmo de promedio ponderado, pero también se verá afectado por los datos de cola larga.

Por ejemplo, cuando un cierto valor RTT es docenas de veces mayor que el valor normal y el peso es ligeramente mayor, el valor promedio ponderado también será grande. Una mejor manera es obtener el valor mediano ponderado, que también es el enfoque de nqe El pseudocódigo es:

//按 RTT 值从小到大排序
samples.sort()
//目标权重是总权重的一半
desiredWeight = 0.5 * totalWeight
//找到目标权重对应的 RTT 值
cumulativeWeight = 0
for sample in samples
  cumulativeWeight += sample.weight
  If (cumulativeWeight >= desiredWeight) 
    return sample.RTT
复制代码

mayor optimización

Calcule el valor de la mediana ponderada a través de datos de muestra de solicitud de red histórica y determine el estado de velocidad de la red para uso comercial de acuerdo con el rango de valor de RTT calculado, como Malo/Bueno Esta estrategia puede cubrir la mayoría de los casos, pero hay dos casos especiales que necesitan para ser optimizado.

Escenario sin acceso a la red

Cuando el usuario no accede a la red durante un período de tiempo y carece de datos de muestra, se introduce una estrategia de detección activa para iniciar una solicitud para calcular el valor RTT en tiempo real.

Rápido deterioro de las condiciones de la red

Si la red de repente se vuelve pobre en un momento determinado y se acumula una gran cantidad de solicitudes en la cola, dado que nuestro valor de RTT depende del destino de las solicitudes de red, el valor de RTT objetivo calculado en este momento tiene un retraso.

Para resolver este problema, puede registrar una cola de "solicitudes que no han aterrizado". Antes de calcular el valor de RTT cada vez, juzgue previamente que las solicitudes no aterrizadas que "superan un cierto umbral" "superan una cierta proporción" son se considera un estado de red débil Logre el efecto de detectar rápidamente la degradación de la red.

Supongo que te gusta

Origin juejin.im/post/7171020344117952542
Recomendado
Clasificación