O script PHP na AWS é executado a 5% em vez de 100%

0

O script PHP abaixo está sendo hospedado atualmente em uma instância c3.large EC2, com armazenamento de instância e uma montagem SSD para o MySQL. O arquivo que o script está lendo está em um dos dispositivos de armazenamento da instância.

Quando o script começa, ele funciona a 100%, como esperado, no entanto, depois de algumas horas, o script desacelera para cerca de 5%, o que acaba atrasando as inserções do MySQL.

Alguma idéia sobre o que está atrasando esse processo? É possivelmente uma questão de IOPS?

$handle = fopen(TMP . 'zones/' . $destinationFile, 'r');
if ($handle) {
    $x = 0;
    $origin = '';
    while (($line = fgets($handle)) !== false) {
        $x = $x + 1;
        $line = str_replace("\r", '', $line);
        $line = str_replace("\n", '', $line);
        if ($x > 61) {
            $record = explode(' ', $line);
            switch ($record[1]) {
                case 'NS':
                    $domain = $record[0];
                    $nameserver = rtrim($record[2], '.');
                    if ($record[2] == $nameserver) {
                        $nameserver = $nameserver . '.' . $origin;
                    }
                    $domainId = $this->addDomain($domain, $origin);
                    $nameserverId = $this->addNameserver($nameserver);
                    $dnId = $this->addDomainNameserver($domainId, $nameserverId);
                    break;
                case 'A':
                    echo 'Nameserver IP: ' . $record[2];
                    break;
            }
        } else {
            if (strpos($line, '$ORIGIN') > -1) {
                $origin = str_replace('$ORIGIN ', '', $line);
                $origin = rtrim($origin, '.');
            }
        }
    }
    fclose($handle);
}
    
por Jeffrey L. Roberts 01.10.2017 / 09:04

1 resposta

0

É melhor perguntar no StackOverflow ... Você menciona inserções do MySQL, mas não vejo nenhum código SQL em sua pergunta. Normalmente, quando você insere grandes quantidades de dados em um banco de dados:

1) você não faz uma solicitação por linha 2) você COMMIT de vez em quando, caso contrário, o DB tem que manter todos os seus dados em um buffer temporário. 3) Mas você não compromete para cada linha, já que isso é caro, normalmente você insere dados por lotes de milhares de linhas.

O MySQL e outros DBMS também possuem maneiras de ingerir grandes tabelas a partir do arquivo (veja LOAD DATA em SQL ou o comando mysqlimport ) para que seu script possa criar esse arquivo intermediário e depois chamar o MySQL para carregá-lo de uma só vez.

    
por 01.10.2017 / 15:15