J'utilise une simple bibliothèque PHP pour ajouter des documents à un index SOLR, via HTTP.
Il y a 3 serveurs impliqués, actuellement:
À 80 documents/sec (sur 1 million de documents), je remarque un taux d'interruption anormalement élevé sur les interfaces réseau sur les boîtes PHP et solr (2000/sec; de plus, le les graphiques sont presque identiques - lorsque le taux d'interruption sur le PHP pic de boîte, il pointe également sur la boîte de Solr), mais beaucoup moins sur la boîte de base de données (300/sec). J'imagine c'est simplement parce que j'ouvre et réutilise une seule connexion au serveur de base de données, mais chaque requête Solr ouvre actuellement une nouvelle connexion HTTP via cURL, grâce à la façon dont la bibliothèque client Solr est écrite.
Donc, ma question est:
cURL PHP ( curl_setopt ) dit:
CURLOPT_FORBID_REUSE
-TRUE
pour forcer la connexion à se fermer explicitement une fois le traitement terminé et à ne pas être regroupée pour être réutilisée.
Alors:
Curl envoie l'en-tête keep-alive par défaut, mais:
curl_init()
sans aucun paramètre.CURLOPT_URL
pour passer l'url au contextecurl_exec()
curl_close()
exemple très basique:
function get($url) {
global $context;
curl_setopt($context, CURLOPT_URL, $url);
return curl_exec($context);
}
$context = curl_init();
//multiple calls to get() here
curl_close($context);
Sur le serveur auquel vous accédez, keep-alive doit être activé et le nombre maximal de requêtes keep-alive doit être raisonnable. Dans le cas d'Apache, reportez-vous à Apache docs .
Vous devez réutiliser le même contexte cURL.
Lors de la configuration du contexte cURL, activez keep-alive avec timeout dans l'en-tête:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
'Connection: Keep-Alive',
'Keep-Alive: 300'
));
Si vous ne vous souciez pas de la réponse de la demande, vous pouvez les faire de manière asynchrone, mais vous courez le risque de surcharger votre index SOLR. J'en doute cependant, SOLR est sacrément rapide.