2009-05-10 4 views
2

У меня есть скрипт php, который вызывает другой скрипт с функцией php exec. Вызываемый скрипт выполняет задание пакетного процесса, которое обновляет состояния транзакций, уведомляет клиентов (помещает электронную почту в почтовую очередь, которая выполняется отдельно). Таким образом, это займет 20-30 минут из-за очень большой таблицы (500000 строк). Теперь я запускаю ее под своей машиной Windows на рабочем столе, а php использует до 50% CPU, 20% -ный процессор mysql. Это обычная практика? Что делать, если я помещаю этот скрипт в общий хостинг? У меня будут проблемы с этим? Он не нарушит правила общего хостинга? Пакетный процесс может запускаться пользователем в любое время (обычно один месяц или чаще).Производительность PHP на общем хостинге

Любые предложения по этому вопросу?

Спасибо за чтение.

+4

Если вы идете на совместный хостинг, можете ли вы сообщить нам, какой из них выбрать - чтобы мы могли его избежать ...или знаете причину внезапного падения производительности нашего хоста ;-) – BrynJ

+0

Итак, мне пришла в голову мысль ... Если вы не правильно указали свои индексы (весь новый разговор), почему вы проходите половину миллион записей, чтобы определить статус, который обрабатывается/очищается в определенный момент? Почему у вас нет другой таблицы, которая специально для статуса? Изменения статуса пользователя => вставить запись в таблицу состояния => процесс собирает все состояния => обрабатывать все состояния => удаляет все статусы. Это то, что происходит? –

+0

@BrynJ - Это совсем не то, что они говорят. Они спрашивают, нормально ли запускать ресурсы на общем хосте. Ответ не зависит от мощности хоста. –

ответ

1

Серверы, которые используют общий хостинг, обычно намного быстрее, чем средний домашний компьютер, поэтому, вероятно, это не займет столько времени, сколько выполняется на вашем локальном компьютере. Я думаю, что тревожные звонки начнут уходить, если вы отправляете 500 000 писем в день, но если у вас есть разумный хост, использующий этот процессор в течение короткого времени, не должно быть слишком большой проблемой.

Вы всегда можете поговорить с ними об этом во-первых, я уверен, что они что-то выберут.

+1

нет, их нет, они на самом деле склонны быть рабочими столами !. Вы все еще можете найти хосты, которые обслуживают сайты на селеронах. Процессор никогда не был решающим фактором для большинства веб-сайтов, особенно для общих. – gbjbaanb

+0

+1 для 500 тыс. Писем в день. Вы обнаружите, что многие провайдеры (с некоторым обоснованием) будут относиться к вам как к спамеру, если вы это сделаете. – cletus

+0

Как насчет +1 для gbjbannb. Конечно, об этом. Реальный вопрос заключается в том, будет ли ** код других народов ** не мешать ресурсам и сбивать ваш сайт/процесс/что-либо на общем хостинге. –

2

Как правило, общие хосты не любят вас, когда вы держите их драгоценную мощность процессора, поэтому я бы не рекомендовал вам делать что-либо очень интенсивное на одном. если вы хотите выполнять пакетные задания, вам следует рассмотреть возможность инвестирования в выделенный сервер, было бы также полезно иметь в целом.

4

Почти наверняка, однако, зависит от того, сколько мощности процессора доступно для общего хоста (возможно, примерно столько же, сколько и на вашем рабочем столе, если честно), и в этом случае вы увидите, что вы загрузились в коротком порядке. Общие хосты, как правило, занимают высокие позиции, где вы можете получить 100 сайтов размещенных сайтов.

Вы можете пойти на виртуальный хост, где они дадут вам свободу делать все, что захотите, но вы, вероятно, найдете там, что объем мощности процессора, на который вы ограничены, ограничен, возможно, слишком ограничен для вас , Виртуальные хосты, как правило, разделяют хост между несколькими виртуальными гостями, иногда всего 4, но чаще (и особенно для более дешевых планов) вплоть до 64.

Ваш третий вариант заключается в том, чтобы пойти полностью выделенный сервер, вы сами получаете весь сервер и можете делать с ним все, что вам нравится. Они, как правило, дороги, если вы хотите много серверного оборудования (потому что оно использует очень дорогое электричество) или большой пропускной способности.

Очевидно, что эти 3 варианта увеличивают стоимость, на арене веб-хостинга вы получаете то, за что платите.

Возможно, вам захочется найти форум для веб-хостинга и спросить о нем - не забудьте указать требования к процессору и сколько времени он может принять. Вы можете получить некоторого хостера, который будет более чем счастлив за то, что вы запустили свой скрипт в «нерабочее время», если вы согласны с ними (не мешая резервным копиям или если они имеют меньшее время ресурса, так как сайты, как правило, доступны по всему миру в каждом часовом поясе)

+0

Действительно, такие ресурсы вряд ли будут доступны на общих хостах. Возможно, один из больших экземпляров VPS (например, linode's: https://manager.linode.com/signup/#plans) со спецификациями, которые похожи на ваш рабочий стол, будет работать хорошо. – F21

+0

Я не согласен с «доступным процессором». Процесс, связывающий CPU time/RAM/IO/etc, как обсуждаемый (в данном случае CPU и, возможно, ОЗУ), неуместен на любом сервере с несколькими целями (чтение: клиенты). Неважно, насколько мощный сервер. Если это 8-процессорный физический процессор, то, что они описывают, по крайней мере, свяжет два из них. Не совсем хорошо, независимо от общего потенциала нагрузки. Если бы я мог проголосовать, я бы :( –

+0

Дополнительно ... Вы просто держите власть, как будто это решение здесь. Я действительно уверен, что вы на самом деле не знаете, как ядра ОС обрабатывают управление задачами, отставания ввода-вывода , swap-память и т. д. Возможно, вам стоит по-настоящему прочитать об этом (или иметь опыт реального мира, оптимизирующий это для конкретных целей), прежде чем вы скажете: «Эй, иди, найди лучший сервер! Посмотри на четыре четверти!» –

2

Я делаю подобное с приложением Facebook (php, 350 000 уведомлений). У меня было 1 «предупреждение» от моей хостинговой компании о загрузке процессора, но это «предупреждение» появилось из продаж, предлагая работать со мной для обновления.

Я сменил пакетный скрипт на использование меньшего количества процессоров за раз, по сути, создав меньше одновременных процессов (10) и поставив команду sleep (10) в несколько точек. Команда sleep предназначена для того, чтобы позволить процессору вернуться к «нормальным» уровням, поэтому есть всплески CPU, а не постоянное использование.

Ожидается, что на общих шинах центрального процессора ожидается всплеск. Но постоянно высокий уровень процессора будет вызывать предупреждения для хостинговой компании (если они хороши). Вы хотите избежать использования центрального процессора на 50% или любого высокого уровня за любой длительный период времени.

Если это не имеет значения, если сценарий занимает и несколько минут, добавьте некоторые состояния ожидания (сон) в свой код. Это также справедливо для других пользователей на одной машине.

0

Я бы предложил использовать такую ​​услугу, как Amazon EC2 или Mosso's Cloud Servers (принадлежащий Rackspace). Это виртуальные серверы, которые имеют разумные почасовые тарифы и отличные API. Вы получаете мощность выделенного сервера без минимальных ежемесячных обязательств. Например, вы можете настроить виртуальный сервер с EC2, а затем ваш обычный веб-сервер будет запускать недельное/ежемесячное задание cron, чтобы запустить экземпляр EC2, запустить ваше задание, а затем закрыть экземпляр EC2.

1

Короче говоря, нецелесообразно запускать ресурсы на общем сервере.

В принципе, если вы уделите достаточно времени другим процессам, это не так уж плохо. Тем не менее, пикирование процессора, как вы обсуждаете, является плохим и не очень приятным для других пользователей системы. У вас должен быть механизм доходности в вашем основном цикле (например, usleep(100)) и выполнить команду с высоким номером nice, например 19.

Кроме того, похоже, что вы выполняете индивидуальные вставки/обновления/etc в своей партии сценарий обработки. С помощью mysql намного лучше использовать пакетные вставки, когда это возможно (очень быстро по сравнению с отдельными). В зависимости от того, как вы это делаете, это может быть компромиссом с ОЗУ для времени процессора (например, если вы сохраняете все значения вставки в строке до тех пор, пока их готовые к вставке с помощью одного оператора insert, то это может добавить до большого количества оперативной памяти). Если ОЗУ является проблемой, вы всегда можете создать временный файл SQL, а затем импортировать все это в конце процесса.

Пакетный вставка выглядит примерно так (для таблицы с двумя столбцами VARCHAR):

INSERT INTO `mytable` VALUES ('Field 1-Row 1', 'Field 2-Row 1'), ('Field 1-Row 2', 'Field 2-Row 2'); 

Эта вставка будет две строки сразу на долю времени.

Но опять же, основываясь на том, что вы называете целью сценария, вы, вероятно, не делаете много вставок для начала. Но, может быть, вы все равно можете собрать все (или многие) из ваших обновлений/вставок/удалений БД в окончательный сценарий, который называется в конце?

Кроме того, если вы уверены, что можете сохранить свои внешние ключи в правильном порядке, делая импорт, то проверка внешних ключей может значительно улучшить скорость.

Все другие возможные варианты могут быть основаны на конкретной оптимизации вашего кода и схемы БД (оптимизация циклов, поисковых запросов, индексов и т. Д.).

Что я сильно подразумевающее здесь является то, что вы можете сделать что-то подобное в хостинге без коробления ресурсов, но ваша структура БД, SQL заявление и алгоритмы (циклы, и т.д.) должны быть оптимизированы. Если вы это сделаете, дополнительное преимущество в том, что ваш процесс также завершится очень быстро. Существует распространенная ошибочная концепция: php + mysql = slow/cpu hog, но в 99% случаев это проблема программирования или дизайна БД. Они должны легко иметь возможность обрабатывать многие записи.

Смежные вопросы