Мотиватор :)
С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607
|
Добавлено: 08/08/10 в 23:53 |
В общем есть у нас софт, который использует мультитредовость. Как известно, PHP её не поддерживает, поэтому вызывается куча instances (не знаю как это перевести на русский, но вы знаете, о чём идёт речь) этого скрипта по крону:
/usr/bin/php path-to/php-thread-script.php thread-num
Скрипт берёт из mySQL базы записи по определенному условию (они содержат адрес получателя, тему письма, текст письма) и отправляет их через SMTP сервер (который работает на том же физическом сервере). Сам скрипт простой, по сути он занимается только отправкой сообщений, которые были адресованы именно этому скрипту (соответствующие поля в базе данных).
В общем, проблема в том, что у сервера очень быстро заканчивается физическая память (сейчас запускаются 60 таких instances, но нам нужно около 200) и сервак в прямом смысле умирает (перестает отвечать на запросы на длительное время, в то время, когда отвечает, команда top показывает загрузку от 20 до 40).
Необходимо заоптимизировать этот процесс по максимуму, в идеале переписать мультитредовый скрипт на C с использованием как можно меньшего количества библиотек.
Стоимость работы и сроки кидайте в личку. Работа срочная.
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 09/08/10 в 04:37 |
немного оффтоп, но все же. скорее всего, такая нагрузка на сервак вызвана не самим php как таковым, а мускулем. си тут особо не поможет. решается просто - перед началом самого процесса работы разом делается нужная выборка из базы, и кладется в удобном виде в файл. во время работы промежуточные результаты кладутся также в файл, если конечно они нужны. единственное, нужно грамотно синхронизацию потоков сделать. после окончания работы файлы считываются и результат импортируется назад в базу.
а чтобы не плодить кучу процессов php, я например рабочую часть скрипта переписал на питоне. там с многопоточностью дела получше, да и субъективно пошустрее стало.
|
|
|
|
php
С нами с 09.10.06
Сообщения: 3706
Рейтинг: 2410
|
Добавлено: 09/08/10 в 07:50 |
webboxxx: +1
можно и перл заюзать, он тоже неплохо подходит для таких целей.
|
|
|
|
С нами с 11.01.07
Сообщения: 3607
Рейтинг: 2686
|
Добавлено: 09/08/10 в 16:17 |
webboxxx: +1
к тому же я уверен что если дело именно в памяти то однозначно дешевле купить еще памяти на сервак, чем переписывать на сях.
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 09/08/10 в 16:37 |
править сишный проект имхо потом будет сложнее... если есть недорогая возможность прооптимизировать пхп-шный скрипт - имхо лучше сделать это. серв не должен укладыватся от 60 потоков для указанной задачи.. тмеболее как написали выше скорее проблема в " берёт из mySQL базы записи по определенному условию", т.е. тормоз дает не оптимизированная работа с базой а не пхп.
|
|
|
|
php
С нами с 09.10.06
Сообщения: 3706
Рейтинг: 2410
|
Добавлено: 09/08/10 в 16:49 |
Heavy: php работает очень плохо с потоками и 60 это для него реально может быть проблематичным.
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 09/08/10 в 17:47 |
хз. задача-то не сложная у ТС... могу только сказать, что чуть выше среднего сервачок держит более 400 instances "мультифида" одновременно в секунду, каждая из которых делает минимум 15-17 обращений в немелкую базу, детальный геоип, и 3-5 запросов курлом.
да и как бы сиджи выживали, если на 60 процессах они были бы уже дохлые.
Цитата: | для него реально может быть проблематичным |
имхо, ключевое слово "может быть", в любом языке|коде если подходить со стороны - "будет тормозить - поставим серв мощнее", оно так и будет. другое дело, что на пыхе в потолок упереться гораздо проще.
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 09/08/10 в 21:58 |
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 10/08/10 в 00:29 |
+1 либо mysql либо smtp тормоз тут.
|
|
|
|
С нами с 20.07.10
Сообщения: 1414
Рейтинг: 56
|
Добавлено: 10/08/10 в 02:32 |
Перепишу )
617965951
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 10/08/10 в 10:34 |
grozny писал: | +1 либо mysql либо smtp тормоз тут. |
Цитата: | В общем, проблема в том, что у сервера очень быстро заканчивается физическая память |
Да, mysql всю ее съедает как-то, конечно
Проблема банальная - в синхронности вызова mail(), который сидит и ждет отправки и плодит процессы. Решение - столь же банально, в асинхронном вызове, том же POE, который просто регистрирует вызов в кернеле и возвращает управление, никакой многопоточности-многопроцессности не нужно, скрипт в один поток все достанет из базы и пулеметом все отправит со скоростью SELECT, пишется за 20 минут на коленке.
Объяснять, что база данных, нормально сделанная, с индексами и запросами, над которыми хотя бы чуть подумали, а не как тут пишут многие, вообще-то на порядки быстрее текстовых файлов - для того их и придумали, что в текстовых файлах искать информацию есть очень ресурсоемкий процесс - я уж не буду, это запредельно.
Последний раз редактировалось: Dr.Syshalt (10/08/10 в 10:53), всего редактировалось 1 раз
|
|
|
|
С нами с 31.05.10
Сообщения: 1991
Рейтинг: 487
|
Добавлено: 10/08/10 в 10:49 |
блин, тс просил чтобы ему скрипт починили а тут собралась куча
потеоретизировать насчет того, что у него могло случиться.
"Это же форум ботаников?" (C) кто-то
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 10/08/10 в 10:54 |
LeadFarmer: А ты типа самый практик по вставлению картинок "я и мои друзья" в форумы?
|
|
|
|
С нами с 20.07.10
Сообщения: 1414
Рейтинг: 56
|
Добавлено: 10/08/10 в 14:57 |
скрипт то переписали?
|
|
|
|
С нами с 31.05.10
Сообщения: 1991
Рейтинг: 487
|
Добавлено: 10/08/10 в 15:19 |
Dr.Syshalt писал: | LeadFarmer: А ты типа самый практик по вставлению картинок "я и мои друзья" в форумы? |
ну раз я тоже отписался в этой ветке то видимо да
|
|
|
|