Задавайте вопросы, мы ответим
Вы не зашли.
У меня в статусе довольно большое значение переменной opened_tables - порядка десятков тысяч. В то же время open_tables - сотни. Из документации (в комментариях) следует, что opened_tables увеличивается, когда серверу не хватает файловых дескрипторов для таблиц и он все же превышает значение, указанное в table_open_cache. У меня оно - 2000 при max_connections=300 (одновременно открывается не более 5 таблиц в запросе). Поясните, пожалуйста, значение этих переменных подробнее и о чем может говорить стремительный рост opened_tables?
Действительно ли это число увеличивается при использовании временных таблиц (они активно используются в моих запросах)
Неактивен
Вы все правильно описали. В переменной table_cahe задается максимальное число одновременно открытых таблиц. Возможные причины
1. у Вас много временных таблиц создается/удаляется и они MyISAM
2. есть лимит в файловой системе на максимальное число открытых файлов (редко, но бывает на VDS), см
Неактивен
у меня под нагрузкой в логах вылазит вот что:
080605 1:57:38 [ERROR] /usr/sbin/mysqld: Can't open file: './WordIndex.frm' (errno: 24)
080605 1:57:38 [ERROR] /usr/sbin/mysqld: Can't open file: './WordIndex.frm' (errno: 24)
080605 1:57:38 [ERROR] /usr/sbin/mysqld: Can't open file: './WordIndex.frm' (errno: 24)
080605 1:57:38 [ERROR] /usr/sbin/mysqld: Can't open file: './WordIndex.frm' (errno: 24)
080605 1:57:38 [ERROR] /usr/sbin/mysqld: Can't open file: './WordIndex.frm' (errno: 24)
080605 1:57:38 [ERROR] /usr/sbin/mysqld: Can't open file: './WordIndex.frm' (errno: 24)
080605 1:59:01 [ERROR] Error in accept: Too many open files
080605 2:03:18 [ERROR] Error in accept: Too many open files
080605 2:07:34 [ERROR] Error in accept: Too many open files
как лечится? влияют ли на это значения max_tmp_tables и т.д. или только ограничения ОС?
может это поможет разобраться:
-- переменные:
max_allowed_packet | 1048576 |
| max_binlog_cache_size | 18446744073709551615 |
| max_binlog_size | 1073741824 |
| max_connect_errors | 10 |
| max_connections | 300 |
| max_delayed_threads | 20 |
| max_error_count | 64 |
| max_heap_table_size | 16777216 |
| max_insert_delayed_threads | 20 |
| max_join_size | 18446744073709551615 |
| max_length_for_sort_data | 1024 |
| max_prepared_stmt_count | 16382 |
| max_relay_log_size | 0 |
| max_seeks_for_key | 18446744073709551615 |
| max_sort_length | 1024 |
| max_sp_recursion_depth | 0 |
| max_tmp_tables | 32
-- global status:
Created_tmp_disk_tables | 58778 |
| Created_tmp_files | 134 |
| Created_tmp_tables | 59594
-- mysqladmin debug:
Table status:
Opened tables: 95492
Open tables: 866
Open files: 882
Open streams: 0
и еще вопрос: я активно использую отложенные вставки. как следует настраивать переменные max_insert_delayed_threads и max_delayed_threads? как они свзаны между собой?
Отредактированно shutdown (07.07.2008 15:22:48)
Неактивен
Это ошибка ОС - не хватает файловых дескрипторов. Что выдает sysctl -a
Какая ОС? У Вас VDS?
Неактивен
ось -
Linux 2.6.18-8.el5 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
sysctl
fs.mqueue.msgsize_max = 8192
fs.mqueue.msg_max = 10
fs.mqueue.queues_max = 256
fs.quota.warnings = 1
fs.quota.syncs = 25
fs.quota.free_dquots = 0
fs.quota.allocated_dquots = 0
fs.quota.cache_hits = 0
fs.quota.writes = 0
fs.quota.reads = 0
fs.quota.drops = 0
fs.quota.lookups = 0
fs.suid_dumpable = 0
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_watches = 8192
fs.inotify.max_user_instances = 128
fs.aio-max-nr = 65536
fs.aio-nr = 0
fs.lease-break-time = 45
fs.dir-notify-enable = 1
fs.leases-enable = 1
fs.overflowgid = 65534
fs.overflowuid = 65534
fs.dentry-state = 8546 6312 45 0 0 0
fs.file-max = 101182
fs.file-nr = 2040 0 101182
fs.inode-state = 3928 1111 0 0 0 0 0
fs.inode-nr = 3928 1111
fs.binfmt_misc.status = enabled
Неактивен
В sysctl все ок, но ошибка 24 такая:
grisha@milli:~ $ perror 24
Error code 24: Too many open files
Посмотрите еще
mysql> show variables like 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
1 row in set (0.00 sec)
Неактивен
да, у меня так же...
переменные сервера, отвечающие за временные таблицы точно не могут такое вызвать?
А, совсем забыл Сервер работает на пределе оперативы... в своп вроде не залазит, но свободно бывает 10-50Мб
Неактивен
Увеличьте open_file_limit до 10000
Неактивен
подскажите как правильно прописать в конфиге. что-то не получается - после перезапуска сервера show global variables выдает старые значения перменных...
Неактивен
в my.cnf в секции [mysqld] добавить
open_file_limit=10000
Неактивен
все нормально, сервер стал работать стабильно после поднятия лимита на файлы.
Но меня по-прежнему волнует вопрос больших значений opened_tables.
в статусе:
| Open_files | 812 |
| Open_streams | 0 |
| Open_table_definitions | 24 |
| Open_tables | 794 |
| Opened_files | 9374776 |
| Opened_table_definitions | 2587676 |
| Opened_tables | 2588670 |
может это прояснит дело? У меня создается на каждый запрос временная таблица с engine=memory.
opened_tables и Opened_table_definitions увеличивается на одно и то же число, примерно на 20 в секунду (что соответствует нагрузке по клиентским запросам).
table_open_cache=2000 (но он похоже не используется настолько, судя по Open_tables)
Неактивен
Временные таблицы могут также создаваться, если сложный запрос с подзапросом, группировкой или сортировкой.
mysql> show global status like '%tmp%'\G
*************************** 1. row ***************************
Variable_name: Created_tmp_disk_tables
Value: 3239579
*************************** 2. row ***************************
Variable_name: Created_tmp_files
Value: 5
*************************** 3. row ***************************
Variable_name: Created_tmp_tables
Value: 5062326
3 rows in set (0.00 sec)
Таблица создается MyISAM если превышает минимальную из переменных (tmp_table_size, max_heap_table_size). Посмотрите на запросы с помощью EXPLAIN.
Неактивен
понятно. вполне возможно, что (tmp_table_size, max_heap_table_size) превышается и создается MyISAM (пока памяти маловато на сервере, я не стал увеличивать эти значения)
у меня вот что:
show global status like '%tmp%'\G
*************************** 1. row ***************************
Variable_name: Created_tmp_disk_tables
Value: 1337113
*************************** 2. row ***************************
Variable_name: Created_tmp_files
Value: 248
*************************** 3. row ***************************
Variable_name: Created_tmp_tables
Value: 1337907
3 rows in set (0.15 sec)
и счетчики растут почти синхронно (кроме файлового), примерно по десятке в секунду
Отредактированно shutdown (11.06.2008 13:16:54)
Неактивен
Когда сделаете апгрейд памяти сервера, сможете эффективно использовать новую оперативку под временные таблицы. Может быть можно упростить запросы так, чтобы они не требовали временных таблиц.
Неактивен