0

0

使用tmpfs文件系统做MySQL tmpdir潜在的问题

php中文网

php中文网

发布时间:2016-06-07 16:47:04

|

1819人浏览过

|

来源于php中文网

原创

当初也是因为看到有人用/dev/shm(tmpfs)做MySQL tmpdir,于是就去学习了下tmpfs。今天再次谈这个问题是因为使用tmpfs做MySQL tmp

在前面我写过一篇关于tmpfs和ramfs对比分析的文章()。当初也是因为看到有人用/dev/shm(tmpfs)做mysql tmpdir,于是就去学习了下tmpfs。今天再次谈这个问题是因为使用tmpfs做mysql tmpdir(以后简称tmpdir)确实还是存在一些问题的,而且在某些特定的linux 内核版本还会触发bug。今天写篇文章记录一下。

当时的机器环境信息: 

[bosen@localhost ~]$ uname -a
Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
[bosen@localhost ~]$ cat /etc/RedHat-release
CentOS release 5.4 (Final) 

bug信息(MySQL-5.5.30社区版): 

130305 16:05:16 InnoDB: Error: Linux Native AIO is not supported on tmpdir.
InnoDB: You can either move tmpdir to a file system that supports native AIO
InnoDB: or you can set innodb_use_native_aio to FALSE to avoid this message.
130305 16:05:16 InnoDB: Error: Linux Native AIO check on tmpdir returned error[22]
130305 16:05:16 InnoDB: Warning: Linux Native AIO disabled.

 

我们可以看到在启动MySQL 实例的时候报tmpdir上不支持Linux Native AIO(tmpdir是放在/dev/shm,它是Linux上必须存在的挂载点,为tmpfs文件系统)。然后就显示的将innodb_use_native_aio关闭了。在bug list上搜索了一下这个问题确实2010年就有人提出来了,也是在CentOS上触发的,原因就是因为某些版本的内核不支持tmpfs上的Linux Native AIO。这个没得多解释为什么,,我也不清楚为什么某些内核版本不支持。那么官方是怎么修复这个bug的呢?其实官方也没有真正意义上进行修复,它仅仅是在启动MySQL实例时对将来可能需要用到tmpfs的地方做检测,如果它不支持AIO那么就显示的将innodb_use_native_aio关闭(因为整个MySQL中只有innodb用到了AIO,所以只需这个参数关闭即可),所以在前面我们看到的现象就是官方修复后的结果,也就是说5.5.30这个版本已经修复这个bug了。

 

那么对于没有修复的版本会存在什么问题呢?其实理论上不会出现问题,因为我们一般用到tmpfs也只可能将其用在tmpdir上,那么它的触发条件就比较特殊:必须是innodb+temporary table才可能触发。为什是这两个条件?

MVM mall 网上购物系统
MVM mall 网上购物系统

采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压

下载

条件1:innodb,因为只有innodb才支持AIO特性,因此这是条件之一。条件2:temporary table。因为我们仅仅在tmpdir上使用到了临时表所以必须得有使用到tmpdir的地方,那就是临时表了。那么你认为你们线上会创建innodb类型的临时表吗?至少我没找到理由要这么做。临时表分两种,显式和隐式,create temporary这是显式临时表,绝大部分都会创建为memory类型;MySQL内部运行过程中创建的临时表叫隐式临时表,比如一个SQL查询,比如表结构变更、比如load data infile。而默认的情况下隐式临时表都是memory类型,当超出参数设定值后就会自动转换为myisam类型,所以也用不到innodb。

所以我说一般这个bug不会出现,从某种角度来说这个bug没修复也是件好事,因为修复之后如果要继续使用tmpfs做为tmpdir,而一旦tmpfs不支持AIO,那么innodb_use_native_aio会被关闭,但AIO对于IO密集型应用来说性能有一定的提升,具体数据应该是tps提升15%左右,当然这与底层存储设备、IO线程数都有关系,所以这个数值并不会一定准确,但是可以肯定的是性能不会下降。

但即使这个bug永远不会触发,使用tmpfs做tmpdir还是会存在一些问题的,前面说了DDL、load data infile会使用tmpdir,而这些操作需要的临时表空间是很大的,如果使用tmpfs很有可能瞬间对内存的冲击很大,导致系统抖动、swap大量使用等等从而造成性能影响。所以建议线上还是不要使用tmpfs较好。

最后再介绍一个跟tmpfs相关的bug,也是在这次测试时发现的,当然就显得更加不重要了。前面测试tmpfs不支持AIO这个bug时用的是5.5.30版本,为了测试公司内部的5.5.12是否存在相同的问题,于是也做了同样的测试 create temporary table tmp(a int)engine=innodb ,结果error log中有如下信息:

130306 10:46:51 InnoDB: O_DIRECT is known to result in 'Invalid argument' on Linux on tmpfs, see MySQL Bug#26662
130306 10:46:51 InnoDB: Failed to set O_DIRECT on file /dev/shm/#sql26a1_1_0.ibd: OPEN: Invalid argument, continuing anyway
130306 10:46:51 InnoDB: O_DIRECT is known to result in 'Invalid argument' on Linux on tmpfs, see MySQL Bug#26662
130306 10:46:52 InnoDB: Operating system error number 22 in a file operation.
InnoDB: Error number 22 means 'Invalid argument'.
InnoDB: Some operating system error numbers are described at
InnoDB:
InnoDB: File name /dev/shm/#sql26a1_1_0.ibd

这个bug很明显tmpfs上不支持在open的时候加O_DIRECT参数,原理是什么呢?根据个人理解,我觉得是因为tmpfs采用vm实现,就是page cache那层(参见tempfs和ramfs对比分析那篇文章里面说的tmpfs与ramfs性能比较那段),而O_DIRECT的目的就是绕过page cache这层,所以tmpfs不支持O_DIRECT自然也就是情理之中了。

之前一直认为使用tmpfs做tmpdir会加速大临时表速度,觉得如果内存充足是个不错的选择,看来还是会存在很多问题。所以很多东西还是要多测试、多思考,当然还要对底层很多原理性的东西有一定了解,这样才能更好的解决问题。

linux

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

极致CMS零基础建站教学视频
极致CMS零基础建站教学视频

共62课时 | 5.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号