http: Aceptar error: aceptar tcp 127.0.0.1:8545: aceptar: demasiados archivos abiertos; reintentando en 5ms

Estoy corriendo geth -rpcy nodepara interactuar directamente con la cadena de bloques. Al ejecutar una gran cantidad de solicitudes, noté el siguiente error:

http: Accept error: accept tcp 127.0.0.1:8545: accept: too many open files; retrying in 5ms

¿Cómo puedo configurar geth para manejar más conexiones? mi código es:

var Web3 = require("web3")
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

// first
txs = [];
// second

for (i = 0; i < 100; i++) {

web3.eth.getBlock(4000000+i, function(error, block) {
        if(!error) {
            for (j = 0; j < block.transactions.length; j++) { 
            web3.eth.getTransaction(block.transactions[j], function(error, transaction) {
                    if(!error) {
                        txs.push({block: transaction.blockNumber, from: transaction.from, to: transaction.to, value: transaction.value.toNumber(), id: block.transactions.indexOf(transaction.hash)})
                    }
                    else
                    console.error(error);
                });
            }
        }
        else
        console.error(error);
    });
}

Respuestas (1)

Si está ejecutando Ubuntu o una versión similar de Linux, entonces el límite por usuario (suave) en la cantidad de descriptores de archivos es 1024.

$ ulimit -n
1024

Tiene varias opciones para sortear el error que está viendo, incluido el aumento de los límites flexibles y estrictos para el usuario en cuestión.

Hay detalles de cómo hacer esto en una respuesta anterior .

(También puede encontrar útil este hilo: Fragmentos de JavaScript útiles comunes para geth )

No es posible, al menos hasta la versión 1.8.13-stable-225171a4, aumentar la cantidad de archivos abiertos a más de 2048. Puede aumentarlos a cualquier número que desee en los límites del sistema, usuario o proceso de Unix, pero geth lo limita a 2048. Constantemente sufrimos demasiados errores de archivos abiertos y, hasta donde sabemos, no hay otra solución que cambiar los límites en un bucle constante en segundo plano.