mysql多表内存使用率

bmvo0sr5  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(470)

**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

去年关门了。
改进这个问题
我有一个mysql,有100000个表。对于我的系统来说,这是目前最好的设计,因为这些表彼此不相关,选择查询将只在一个表上。此外,用户很可能不会经常访问相同的表。
我有16gbram,但大约一天后,mysql消耗了其中的90%,而我对系统的总内存使用率为99-100%。我尝试了很多方法,但都无法降低内存使用率。
我的 innodb_buffer_pool_size 目前是8gb,但我有它在1g与同一问题。我也试着减少 open_files_limit 但这也没用。
这是我的输出

SHOW GLOBAL STATUS LIKE '%Open_%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| Com_show_open_tables       | 0        |
| Innodb_num_open_files      | 431      |
| Open_files                 | 0        |
| Open_streams               | 0        |
| Open_table_definitions     | 615      |
| Open_tables                | 416      |
| Opened_files               | 4606655  |
| Opened_table_definitions   | 4598528  |
| Opened_tables              | 4661002  |
| Slave_open_temp_tables     | 0        |
| Table_open_cache_hits      | 30024782 |
| Table_open_cache_misses    | 4661002  |
| Table_open_cache_overflows | 4660579  |
+----------------------------+----------+

这是我的mysqld配置:

sql-mode=''
innodb_buffer_pool_size = 8G
open_files_limit=100000
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket  = /var/run/mysqld/mysqld.sock
port        = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir  = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address        = 127.0.0.1
key_buffer_size     = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit   = 1M
query_cache_size        = 16M
log_error = /var/log/mysql/error.log
expire_logs_days    = 10
max_binlog_size   = 100M

有人知道如何有效地处理这几千张table吗?
附加信息
a) mysqld公司:https://pastebin.com/ptiz6urd
b) 显示全局状态:https://pastebin.com/k4scmvfz
c) 显示全局变量:https://pastebin.com/cc64bauw
d) mysqltuner:https://pastebin.com/zlzayi56
e) 显示引擎innodb状态:https://pastebin.com/hhduw6gy
f) 顶部:https://pastebin.com/6wynsnpm
服务器重新启动后的测试(占用的内存很少):
a) 乌利米特-a:https://pastebin.com/fmprakhu
b) iostat-x:https://pastebin.com/l0g7h8s4
c) 测向-h:https://pastebin.com/d3ettr19
d) mysqltuner:https://pastebin.com/t3dydlg8

wn9m85ua

wn9m85ua1#

要删除的第一个块将在linux命令行ulimit-n124000中,以超过当前1024个打开文件的限制现在就可以完成,不需要关闭/重新启动linux就可以激活它。
为您的my.cnf[mysqld]部分考虑的建议

table_open_cache=10000  # from 431 available today to a practical upper limit
table_definition_cache=10000  # from 615 available today to a practical upper limit
thread_cache_size=100  # from 8 for V8 refman CAP suggested to avoid OOM
max_heap_table_size=64M  # from 16M to reduce created_tmp_disk_tables
tmp_table_size=64M  # from 16M should always be equal to max_heap_table_size
innodb_lru_scan_depth=100  # from 1024 to reduce CPU workload every SECOND
innodb_log_buffer_size=512M  # from 50M to avoid log rotation every 7 minutes

考虑到你的情况,我会跳过一天一个的规则,在下一个全局变量改变之前进行监视。进行所有cnf更改。停止/启动服务是必需的,因为您在mysql中只能打开\u文件\u limit,即使您请求100000 ulimit,但运行时将您限制为1024。
如果将块复制粘贴到mysqld节的末尾,只删除mysqld节中块上方相同的命名变量,则将为下一个分析人员消除“多变量混淆”。
请查看个人资料以获取联系信息并取得联系。

相关问题