Крутые спецы по MySQL, простейщий вопрос от нуба!

12
AlexVenga
На сайте с 10.04.2007
Offline
190
1358

вводные данные:

MacOS, MAMP, MYSQL, APACHIE

Имеем php файл, выполняющий слдующую задачу:

1) выбираем из БД запись с УРЛ

2) Загружаем этот УРЛ

3) Парсим

4) Проверяем много много отпарсенных данных на наличие в БД

5) Если нет - добавляем

6) Прекращаем работу

7) Через секунду перезапускаемся

Одновременно во вкладках открыто 30 таких файлов.

(каждый выбирает изначально разные строки из пункта 1)

Смысл в том чтобы выборка из БД, загрузка страниц и добавление данных шло в 30 потоков

По факту, апач запускает 30 процессов - без проблем, а MySQL держит 6 коннектов и не больше!

Aleksejs-MBP:bin ALEX$ ./mysqladmin -uroot -proot processlist
+------+------+-----------+--------------+---------+------+------------------------------+----------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+------+-----------+--------------+---------+------+------------------------------+----------------------------------------------------------------------+
| 2641 | root | localhost | google_place | Query | 1 | Waiting for table level lock | UPDATE `dev_company_addr` SET `flag` = 2 WHERE `id` = 869059 LIMIT 1 |
| 2643 | root | localhost | google_place | Query | 1 | Waiting for table level lock | UPDATE `dev_company_addr` SET `flag` = 3 WHERE `id` = 867043 LIMIT 1 |
| 2644 | root | localhost | google_place | Query | 2 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 500, 1 |
| 2645 | root | localhost | google_place | Query | 2 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 800, 1 |
| 2646 | root | localhost | google_place | Query | 2 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 200, 1 |
| 2647 | root | localhost | google_place | Query | 1 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 300, 1 |
| 2648 | root | localhost | | Query | 0 | | show processlist |
+------+------+-----------+--------------+---------+------+------------------------------+----------------------------------------------------------------------+

Как заставить MySQL тоже держать 30 одновременных коннектов?

Данные добавляются и проверяются на наличие в 1 таблице, чтобы обновление и вставка не блокировали друг друга тип таблицы InnoDB - верно ли это?

Антикризисное предложение: [Бурж, AdSense] [NEW] Сайты - каталоги компаний с гарантией трафа [Дорого] (/ru/forum/1006462)
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#1

Каковы значения:

max_user_connections

max_connections

?

таблицы InnoDB - верно ли это?

Верно.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
AlexVenga
На сайте с 10.04.2007
Offline
190
#2
LEOnidUKG:
Каковы значения:

max_user_connections
max_connections

?



Верно.

my.conf:


# The following options will be passed to all MySQL clients
[client]
#password = your_password
#port = 9999
socket = /Applications/MAMP/tmp/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
#port = 9999
socket = /Applications/MAMP/tmp/mysql/mysql.sock
key_buffer = 16M
max_allowed_packet = 16M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

#Alex temp
max_connections = 100
#end

MAMP_bind-address_MAMP


MAMP_skip-networking_MAMP

server-id = 1


[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

# DONT REMOVE: MAMP PRO my.cnf template compatibility version: 5

удалил большие каменты

N
На сайте с 06.05.2007
Offline
419
#3
AlexVenga:
InnoDB - верно ли это?

Верно-то верно, но у вас, судя по этой блокировке, не все таблицы innodb :

AlexVenga:
| 2641 | root | localhost | google_place | Query | 1 | Waiting for table level lock | UPDATE `dev_company_addr` SET `flag` = 2 WHERE `id` = 869059 LIMIT 1 |

Надо бы убедиться. Хотя, такое состояние потока и при innodb возможно.

Кнопка вызова админа ()
AlexVenga
На сайте с 10.04.2007
Offline
190
#4
netwind:
Верно-то верно, но у вас, судя по этой блокировке, не все таблицы innodb :

Надо бы убедиться. Хотя, такое состояние потока и при innodb возможно.

да, вы правы)))

МуИсам было, с этим меняю.

А что по коннектам?

Просто в некоторых других таких задачах я открывал соединение, выбирал урл, закрывал соединение, парсил, обрабатывал (около 5 сек), затем снова открывал соединение и добавлял данные

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#5
AlexVenga:
да, вы правы)))
МуИсам было, с этим меняю.
А что по коннектам?

Просто в некоторых других таких задачах я открывал соединение, выбирал урл, закрывал соединение, парсил, обрабатывал (около 5 сек), затем снова открывал соединение и добавлял данные

Вы что-то путаете, mysql сама разбирается, когда и что ей открывать.

Если вы хотите постоянное соединение, это вроде как надо http://www.php.su/functions/?mysql_pconnect

Но уже не помню устаревшее оно или нет.

Вообще у вас какие проблемы с работой то?

AlexVenga
На сайте с 10.04.2007
Offline
190
#6

работает в реальности 30 потоков пхп и апача - а мускула тока 6

---------- Добавлено 02.08.2015 в 17:21 ----------

max_user_connections

max_connections

выставил 32 на оба параметра

Но ситуация не изменилась.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#7
AlexVenga:
работает в реальности 30 потоков пхп и апача - а мускула тока 6

Вы смотрите НЕ потоки. А просто текущую задачу. Оно могло уже выполниться и всё. Вы как отслеживаете, что именно только 6-ть потоков?

Попробуйте тогда ещё:

thread_concurrency. Если у вас много памяти и много таблиц, то для увеличения производительности, при запуске сервера рекомендуется использовать следующие формулы, учитывающие специфику работы mysql под различные ОС:

Для FreeBSD: thread_concurrency = (кол-во процессоров)*(кол-во ядер в одном процессоре)

Для Linux: thread_concurrency = (кол-во процессоров)*(кол-во ядер в одном процессоре)*3

Почему на Linux можно давать можно и нужно давать больше потоков, чем на FreeBSD? Это связано с тем, что Linux умеет распределять и управлять потоками между ядрами, а FreeBSD не умеет, зато FreeBSD умеет эффективно распределять процессы, чего, в свою очередь, не умеет Linux.

N
На сайте с 06.05.2007
Offline
419
#8
AlexVenga:
А что по коннектам?

Ничего. Статистически, изменения в конфиге mysql почти никогда никому не помогают. Не надо их портить. Там было 100 - пусть и останется.

А вот разбор как же обрабатывается запросы и изменение приложения - почти наверняка помогает.

AlexVenga:
Но ситуация не изменилась.

А что же теперь в processlist ?

AlexVenga:
Просто в некоторых других таких задачах я открывал соединение, выбирал урл, закрывал соединение, парсил, обрабатывал (около 5 сек), затем снова открывал соединение и добавлял данные

почему бы нет.

По факту, апач запускает 30 процессов - без проблем, а MySQL держит 6 коннектов и не больше!

Не доказано. ( Хотя и такое возможно, если есть какая-то проблема с созданием процессов )

Просто видим 6 потоков. Просто клиент не хочет их создавать. Ошибки на клиенте ведь не возникают?

AlexVenga
На сайте с 10.04.2007
Offline
190
#9
netwind:
Ничего. Статистически, изменения в конфиге mysql почти никогда никому не помогают. Не надо их портить. Там было 100 - пусть и останется.
А вот разбор как же обрабатывается запросы и изменение приложения - почти наверняка помогает.


А что же теперь в processlist ?

Aleksejs-MBP:bin ALEX$ ./mysqladmin -uroot -proot processlist

+------+------+-----------+--------------+---------+------+--------------+---------------------------------------------------------------+

| Id | User | Host | db | Command | Time | State | Info |

+------+------+-----------+--------------+---------+------+--------------+---------------------------------------------------------------+

| 2776 | root | localhost | google_place | Query | 5 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 1000, 1 |

| 2777 | root | localhost | google_place | Query | 5 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 800, 1 |

| 2778 | root | localhost | google_place | Query | 5 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 1800, 1 |

| 2779 | root | localhost | google_place | Query | 5 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 2900, 1 |

| 2780 | root | localhost | google_place | Query | 5 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 1500, 1 |

| 2781 | root | localhost | google_place | Query | 4 | Sending data | SELECT * FROM `dev_company_addr` WHERE `flag`=0 LIMIT 300, 1 |

| 2782 | root | localhost | | Query | 0 | | show processlist |

+------+------+-----------+--------------+---------+------+--------------+---------------------------------------------------------------+

netwind:

почему бы нет.

Не доказано. ( Хотя и такое возможно, если есть какая-то проблема с созданием процессов )
Просто видим 6 потоков. Просто клиент не хочет их создавать. Ошибки на клиенте ведь не возникают?

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

Ошибок на клиенте нет.

Думаете надо в настройках апача поковырятся ещё?

N
На сайте с 06.05.2007
Offline
419
#10

AlexVenga, да просто сделайте из разных окон еще несколько пользовательских (не root) подключений чтобы их было больше 6. И узнаете есть ли проблема с обработкой дополнительных подключений у mysql

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий