PHP-скрипт ниже в настоящее время размещен на экземпляре c3.large EC2 с хранилищем экземпляра и монтированием SSD для MySQL. Файл, который читает скрипт, находится на одном из устройств хранения экземпляра.
Когда скрипт впервые запускается, он работает на 100%, как и ожидалось, однако через несколько часов скорость скрипта снижается примерно до 5%, в конечном итоге замедляя вставки MySQL до минимума.
Есть идеи, что замедляет этот процесс? Возможно, это проблема 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);
}
решение1
Лучше спросите на StackOverflow... Вы упоминаете вставки MySQL, но я не вижу в вашем вопросе никакого кода SQL. Обычно, когда вы вставляете большие объемы данных в базу данных:
1) вы не делаете один запрос на строку 2) вы время от времени делаете COMMIT, иначе БД придется хранить все ваши данные во временном буфере. 3) Но вы также не делаете COMMIT для каждой строки, так как это затратно; обычно вы вводите данные пакетами по несколько тысяч строк.
Также MySQL и другие СУБД имеют способы загрузки больших таблиц из файла (см.LOAD DATA
в SQLили mysqlimport
команда), чтобы ваш скрипт мог создать этот промежуточный файл, а затем вызвать MySQL для его загрузки за один раз.