Master-X
Форум | Новости | Статьи
Главная » Форум » Работа » 
Тема: Нужно переписать скрипт с PHP на С
цитата
08/08/10 в 23:53
 alex.raven
В общем есть у нас софт, который использует мультитредовость. Как известно, PHP её не поддерживает, поэтому вызывается куча instances (не знаю как это перевести на русский, но вы знаете, о чём идёт речь) этого скрипта по крону:

/usr/bin/php path-to/php-thread-script.php thread-num

Скрипт берёт из mySQL базы записи по определенному условию (они содержат адрес получателя, тему письма, текст письма) и отправляет их через SMTP сервер (который работает на том же физическом сервере). Сам скрипт простой, по сути он занимается только отправкой сообщений, которые были адресованы именно этому скрипту (соответствующие поля в базе данных).

В общем, проблема в том, что у сервера очень быстро заканчивается физическая память (сейчас запускаются 60 таких instances, но нам нужно около 200) и сервак в прямом смысле умирает (перестает отвечать на запросы на длительное время, в то время, когда отвечает, команда top показывает загрузку от 20 до 40).

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

Стоимость работы и сроки кидайте в личку. Работа срочная.
цитата
09/08/10 в 04:37
 webboxxx
немного оффтоп, но все же. скорее всего, такая нагрузка на сервак вызвана не самим php как таковым, а мускулем. си тут особо не поможет. решается просто - перед началом самого процесса работы разом делается нужная выборка из базы, и кладется в удобном виде в файл. во время работы промежуточные результаты кладутся также в файл, если конечно они нужны. единственное, нужно грамотно синхронизацию потоков сделать. после окончания работы файлы считываются и результат импортируется назад в базу.

а чтобы не плодить кучу процессов php, я например рабочую часть скрипта переписал на питоне. там с многопоточностью дела получше, да и субъективно пошустрее стало.
цитата
09/08/10 в 07:50
 _s_[sov]
webboxxx: +1
можно и перл заюзать, он тоже неплохо подходит для таких целей.
цитата
09/08/10 в 16:17
 LemonS
webboxxx: +1

к тому же я уверен что если дело именно в памяти то однозначно дешевле купить еще памяти на сервак, чем переписывать на сях.
цитата
09/08/10 в 16:37
 Heavy
править сишный проект имхо потом будет сложнее... если есть недорогая возможность прооптимизировать пхп-шный скрипт - имхо лучше сделать это. серв не должен укладыватся от 60 потоков для указанной задачи.. тмеболее как написали выше скорее проблема в " берёт из mySQL базы записи по определенному условию", т.е. тормоз дает не оптимизированная работа с базой а не пхп.
цитата
09/08/10 в 16:49
 _s_[sov]
Heavy: php работает очень плохо с потоками и 60 это для него реально может быть проблематичным.
цитата
09/08/10 в 17:47
 Heavy
хз. задача-то не сложная у ТС... могу только сказать, что чуть выше среднего сервачок держит более 400 instances "мультифида" одновременно в секунду, каждая из которых делает минимум 15-17 обращений в немелкую базу, детальный геоип, и 3-5 запросов курлом.
да и как бы сиджи выживали, если на 60 процессах они были бы уже дохлые.

Цитата:
для него реально может быть проблематичным

имхо, ключевое слово "может быть", в любом языке|коде если подходить со стороны - "будет тормозить - поставим серв мощнее", оно так и будет. другое дело, что на пыхе в потолок упереться гораздо проще.
цитата
09/08/10 в 21:58
 Dr.Syshalt
Все уже написали

http://search.cpan.org/~ultradm/POE-Component-Client-SMTP-0.22/lib/…nt/SMTP.pm

Задача, как говорил Холмс, "на одну трубку". Даже местные "работающие за орешки" должны бы справиться без проблем.
цитата
10/08/10 в 00:29
 idk2045
+1 либо mysql либо smtp тормоз тут.
цитата
10/08/10 в 02:32
 void.singleton
Перепишу )
617965951
цитата
10/08/10 в 10:34
 Dr.Syshalt
grozny писал:
+1 либо mysql либо smtp тормоз тут.


Цитата:
В общем, проблема в том, что у сервера очень быстро заканчивается физическая память


Да, mysql всю ее съедает как-то, конечно icon_rolleyes.gif
Проблема банальная - в синхронности вызова mail(), который сидит и ждет отправки и плодит процессы. Решение - столь же банально, в асинхронном вызове, том же POE, который просто регистрирует вызов в кернеле и возвращает управление, никакой многопоточности-многопроцессности не нужно, скрипт в один поток все достанет из базы и пулеметом все отправит со скоростью SELECT, пишется за 20 минут на коленке.

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

Последний раз редактировалось: Dr.Syshalt (10/08/10 в 10:53), всего редактировалось 1 раз
цитата
10/08/10 в 10:49
 LeadFarmer
блин, тс просил чтобы ему скрипт починили а тут собралась куча

потеоретизировать насчет того, что у него могло случиться. icon_smile.gif
"Это же форум ботаников?" (C) кто-то
цитата
10/08/10 в 10:54
 Dr.Syshalt
LeadFarmer: А ты типа самый практик по вставлению картинок "я и мои друзья" в форумы?
цитата
10/08/10 в 14:57
 void.singleton
скрипт то переписали?
цитата
10/08/10 в 15:19
 LeadFarmer
Dr.Syshalt писал:
LeadFarmer: А ты типа самый практик по вставлению картинок "я и мои друзья" в форумы?

ну раз я тоже отписался в этой ветке то видимо да icon_smile.gif


Эта страница в полной версии