Resuelve el proceso del navegador Chrome ERR_INSUFFICIENT_RESOURCES

Tabla de contenido

1. Antecedentes

2. Descarga la herramienta de compilación depot_tools

3. Descarga el código fuente de Chromium        

4. Analice el código de Chromium y agregue registros

4. Compilar Chrome

5. Problema de posicionamiento

6. Soluciones

Seven, pisando el pit record


1. Antecedentes

Recientemente, los colegas de servicio al cliente de la empresa informaron a menudo que las excepciones ERR_INSUFFICIENT_RESOURCES a menudo aparecían en el navegador Chrome después de las cuatro de la tarde, lo que provocaba que el sistema de servicio al cliente no funcionara con normalidad. La característica principal es que esta excepción se informará cuando se abra una nueva pestaña y se puede usar normalmente en la pestaña original. Limpia la memoria caché de tu navegador y volverá a aparecer pronto. Los socios front-end de nuestro equipo nunca se han encontrado con este problema, por lo que también buscamos mucha información relevante en Internet y encontramos que un blog encontró una escena que era similar a la escena que encontramos, así que intentamos a lo largo de este línea de pensamiento, lo localicé y finalmente verifiqué que es el mismo problema, a continuación, describiré todo el proceso de posicionamiento y solución, esperando ayudar a los estudiantes que se encuentren con problemas relacionados.

2. Descarga la herramienta de compilación depot_tools

       (Al descargar el código fuente de Chrome, asegúrese de que puede acceder a Google normalmente)  deptool es una herramienta para descargar y compilar Chrome. Use git para clonar la herramienta deptool localmente:

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

En este momento, las herramientas de línea de comandos, como fetch y gclient, se pueden acceder y ejecutar a través de rutas absolutas, pero para la comodidad de las operaciones posteriores, se pueden agregar a PATH

export PATH="$PATH:/path/to/depot_tools"

Después de completar, pruebe si el comando de búsqueda está disponible en la línea de comandos:

which fetch

3. Descarga el código fuente de Chromium
        

Debido a que el proceso de código de descarga principal de gclient, fetch y otras herramientas también depende de git, se sugiere ajustar la siguiente configuración global de git:

git config --global http.postBuffer 524288000
git config --global core.precomposeUnicode true

Debido a que el proyecto chrommium tiene una larga historia y el almacén de git es extremadamente grande, para completar el código de descarga más rápido, puede extraer el código ignorando el código de envío histórico para acelerar la velocidad.

fetch --no-history chromium

Si la extracción falla, puede ejecutar el siguiente comando para continuar con la extracción. Este comando admite la reanudación de cargas desde puntos de interrupción.

gclient sync

4. Analice el código de Chromium y agregue registros

Utilice VS para abrir el directorio Chromium/src/services, que es la capa básica de servicios del sistema de Chrome. Busque ERR_INSUFFICIENT_RESOURCES y encuentre más de 100 lugares. Encontramos el siguiente código en services/network/url_loader_factory.cc

void URLLoaderFactory::CreateLoaderAndStartWithSyncClient(
    mojo::PendingReceiver<mojom::URLLoader> receiver,
    int32_t request_id,
    uint32_t options,
    const ResourceRequest& resource_request,
    mojo::PendingRemote<mojom::URLLoaderClient> client,
    base::WeakPtr<mojom::URLLoaderClient> sync_client,
    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
 
  // 省略前面代码
  
  bool exhausted = false;
  if (!context_->CanCreateLoader(params_->process_id)) {
    exhausted = true;
  }

  int keepalive_request_size = 0;
  if (resource_request.keepalive && keepalive_statistics_recorder) {
    const size_t url_size = resource_request.url.spec().size();
    size_t headers_size = 0;

    net::HttpRequestHeaders merged_headers = resource_request.headers;
    merged_headers.MergeFrom(resource_request.cors_exempt_headers);

    for (const auto& pair : merged_headers.GetHeaderVector()) {
      headers_size += (pair.key.size() + pair.value.size());
    }

    keepalive_request_size = url_size + headers_size;

    const auto& top_frame_id = *params_->top_frame_id;
    const auto& recorder = *keepalive_statistics_recorder;

    if (!exhausted) {
      if (recorder.num_inflight_requests() >= kMaxKeepaliveConnections ||
          recorder.NumInflightRequestsPerTopLevelFrame(top_frame_id) >=
              kMaxKeepaliveConnectionsPerTopLevelFrame ||
          recorder.GetTotalRequestSizePerTopLevelFrame(top_frame_id) +
                  keepalive_request_size >
              kMaxTotalKeepaliveRequestSize) {
                LOG(ERROR) << "url_loader_factory.cc>>>>CreateLoaderAndStartWithSyncClient>>keepalive_request_size:" << keepalive_request_size
                 << "kMaxTotalKeepaliveRequestSize" << kMaxTotalKeepaliveRequestSize << "recorder.num_inflight_requests()" << recorder.num_inflight_requests()
                 << "kMaxKeepaliveConnections" << kMaxKeepaliveConnections << "recorder.NumInflightRequestsPerTopLevelFrame(top_frame_id) " << recorder.NumInflightRequestsPerTopLevelFrame(top_frame_id)
                 << kMaxKeepaliveConnectionsPerTopLevelFrame << kMaxKeepaliveConnectionsPerTopLevelFrame << " recorder.GetTotalRequestSizePerTopLevelFrame(top_frame_id) + keepalive_request_size " 
                 << recorder.GetTotalRequestSizePerTopLevelFrame(top_frame_id) + keepalive_request_size ;
        exhausted = true;
      }
    }
  }

  if (exhausted) {
    //新增日志便于测试
    LOG(ERROR) << "url_loader_factory.cc>>>>ERR_INSUFFICIENT_RESOURCES";
    URLLoaderCompletionStatus status;
    status.error_code = net::ERR_INSUFFICIENT_RESOURCES;
    status.exists_in_cache = false;
    status.completion_time = base::TimeTicks::Now();
    mojo::Remote<mojom::URLLoaderClient>(std::move(client))->OnComplete(status);
    return;
  }

  //省略后面代码
}

Al analizar el método CreateLoaderAndStartWithSyncClient de services/network/url_loader_factory.cc, se encontró que cuando exhausted=true, se lanzará una excepción ERR_INSUFFICIENT_RESOURCES. Sigamos viendo bajo qué escenario exhausted=true.


bool NetworkContext::CanCreateLoader(uint32_t process_id) {
  auto it = loader_count_per_process_.find(process_id);
  uint32_t count = (it == loader_count_per_process_.end() ? 0 : it->second);
  //新增日志便于测试
  LOG(ERROR) << "network_context.cc>>>>CanCreateLoader>>count" << count << "process_id:" << process_id;
  return count < max_loaders_per_process_;
}
  // A count of outstanding requests per initiating process.
  //每一个初始化进程所能承受的最大未完成的请求数。
  std::map<uint32_t, uint32_t> loader_count_per_process_;

  // static constexpr uint32_t kMaxOutstandingRequestsPerProcess = 2700;
  //便于复现问题将数值调整为100=================================================
  static constexpr uint32_t kMaxOutstandingRequestsPerProcess = 100;
  uint32_t max_loaders_per_process_ = kMaxOutstandingRequestsPerProcess;

El método CanCreateLoader de services/network/network_context.cc se basará en el mismo process_id

Si el recuento a continuación es mayor que el valor de kMaxOutstandingRequestsPerProcess (el valor predeterminado es 2700) determina el valor de exhausted Para facilitar la reproducción del problema, lo ajusté a 100. Al mismo tiempo, también agregué el registro correspondiente.

4. Compilar Chrome

La mayoría de los proyectos C++ de Google usan una herramienta de compilación multiplataforma como ninja, y la capa inferior de ninja en el lado de mac llamará al compilador clang de Apple.

Debido a que los parámetros de compilación de ninja son relativamente complicados, Google proporciona una herramienta como gn para generar un archivo ninja adecuado de acuerdo con el entorno del sistema actual. Después de eso, no es necesario configurar ningún parámetro al compilar con autoninja, y compilar directamente en función de el archivo de configuración ninjaFile.

El proceso específico es el siguiente:

gn gen out/Default

Ahora se generará una serie de parámetros y configuraciones requeridas para compilar Chrome en el directorio de salida, y luego comenzará a compilar (todo el proceso toma alrededor de 8 horas, dependiendo de la configuración de la computadora):

autoninja -C out/Default chrome

Una vez completada la compilación, verá un archivo ejecutable como ./out/Default/Chromium.app/Contents/MacOS/Chromium en el directorio de salida.

Para poder ver los registros agregados, debe usar la línea de comando para iniciar y agregar el parámetro --enable-logging

/个人文件目录/chromium/src/out/Default/Chromium.app/Contents/MacOS/Chromium  --enable-logging

De esta forma, se generará el registro correspondiente al operar Chrome.

5. Problema de posicionamiento

[38514:19971:1103/151157.874646:ERROR:network_context.cc(915)] network_context.cc>>>>LoaderCreated>>process_id:0 count>>101
[38514:19971:1103/151157.875321:ERROR:url_loader_factory.cc(182)] url_loader_factory.cc>>>>CreateLoaderAndStartWithSyncClient>>url:https://content-autofill.googleapis.com/v1/pages/ChNDaHJvbWUvMTA5LjAuNTM4MS4wEjMJBAwQwvyO8h4SBQ2RYZVOEgUNkWGVThIFDZFhlU4SBQ2BkPF8EgUNgZDxfBIFDZFhlU4SEAkcC8bFxOA28RIFDQbtu_8=?alt=proto
[38514:19971:1103/151157.875475:ERROR:network_context.cc(933)] network_context.cc>>>>CanCreateLoader>>count101process_id:0
[38514:19971:1103/151157.875565:ERROR:url_loader_factory.cc(263)] url_loader_factory.cc>>>>ERR_INSUFFICIENT_RESOURCES
[38514:19971:1103/151157.876158:ERROR:network_context.cc(926)] network_context.cc>>>>LoaderDestroyed>>process_id:0 count>>100

El análisis encontró que cada vez que se crea una nueva pestaña, se activará el proceso de process_id:0, debido a que la función de autocompletar se usa en el proyecto front-end, activará continuamente la solicitud de https://content-autofill. googleapis.com/v1/pages, y esto La computadora no puede acceder a Google, lo que hará que la cantidad de solicitudes sin terminar en el proceso de process_id:0 se siga acumulando, y el sistema de servicio al cliente de nuestra empresa seguirá funcionando durante 8 horas o más. . Esto lleva a que la lógica de verificación del proceso process_id:0 se ejecute primero cada vez que se abre una nueva pestaña, lo que lleva a exhausted=true en el código anterior, pero cuando volvemos a abrir una nueva pestaña, ERR_INSUFFICIENT_RESOURCES se lanzará sin importar cuál. se visita el sitio web Esta excepción.

6. Soluciones

La solución que adopté es configurar el host localmente y apuntar el nombre de dominio *.googleapis.com a 127.0.0.1, de modo que la solicitud de .googleapis.com finalice rápidamente y no se active el umbral de Chrome, evitando así la situación de exhausted=true, nunca recibí comentarios del equipo de servicio al cliente sobre problemas relacionados.

Seven, pisando el pit record

1. Si Science Internet está activado, el código aún no se puede extraer
fatal: no se puede acceder a 'https://chromium.googlesource.com/chromium/tools/depot_tools.git/': no ​​se pudo conectar a chromium.googlesource.com puerto 443 después de 75123 ms: se agotó el tiempo de operación

 exportar https_proxy=http://127.0.0.1:7890
 exportar http_proxy=http://127.0.0.1:7890

2. Hay un problema al clonar un repositorio git grande:

error: RPC falló; transferencia curl 18 cerrada con datos de lectura pendientes restantes

(Error: RPC falló; el transporte curl 18 se cerró pero todavía tiene datos de lectura pendientes)

Después de la investigación, la razón es que el valor predeterminado del postBuffer de curl es demasiado pequeño y necesitamos reconfigurar el tamaño en la terminal:

//Establezca el http.postBuffer global en 200M, es decir, 2000x1024x1024=2097152000 bit
//(Si el objetivo es realmente más grande que 200M, cámbielo según las necesidades reales)
git config --global http.postBuffer 209715200000
//Puede ver el git privado existente después de la modificación Configurar la lista para determinar si es exitosa
git config --list
 

Referencia: Comparta una experiencia de contratación directa de depuración del lado empresarial para Boss-Knowledge

Compilación local de notas paso a paso del navegador Chrome en Mac (último en 2021.02) - Se busca programador

Supongo que te gusta

Origin blog.csdn.net/gjd1988/article/details/128478824
Recomendado
Clasificación