MySQL为什么lsof会看到这么多临时文件_第1页
MySQL为什么lsof会看到这么多临时文件_第2页
MySQL为什么lsof会看到这么多临时文件_第3页
MySQL为什么lsof会看到这么多临时文件_第4页
MySQL为什么lsof会看到这么多临时文件_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MySQL为什么Isof会看到这么多临时文件版本:-一问题提出-般情况下我们会使用Isof命令来查看MySQL当前使用的临时文件的使用这是因为这些临时文件使用Is命令并不能显示,在5.7中其建立方式是使用Liunx api mkstemp进行的建立,这种 文件是进程专用的,返回文件描述符后会使用api unlink进行删除.源码主要就是这一段*其包含在create_temp_file函数中一org_file=mkstemp(to);if (mode & O_TEMPORARY) (void) my_delete(to, MYF(MY_WME);在5.7中如下常的一些功能会用到这种临时文件,出如

2、:执行计划filesort文件名字:MY开头Isof|grep delete 如:/tmp/MYdRHIGW (deleted)大事务binary log缓存文件名字:ML开头Isof|grep delete如:/tmp/MLq9INFu (deleted)online DDL涉及排序也如add key,一般是ib开头Alter tAble testsort Add key(id);Isof|grep delete如:/tmp/ibCxlYQg (deleted)/tmp/ib51nvZl (deleted)设置innodb_tmpciir可以寻这类文件方攵至!j指定的I目录但是当一个MySQ

3、LD进程刚刚启动的时候我们去查看这类文件的时候,会发现很多这类文件, 如下:rootmgr2 # lsofgrep deletegrep mysqlwc -1215rootmgr2 #这些文件大小基本都是0,且都以ib开头,曾经有朋友问过我这个问题,这里详细做一下解 释一二一 MySQLD初始化后的临时文件种类实际上在5.7中这类文件均由函数create_temp_file建立,那么我们就可以在MySQLD后动的时 候将断点放在上面进行分析了 一下面这样一些文件,均使用的是2开头的临时文件。srv_monitor_file (srv0start.cc:2022):这是我们通常show engi

4、ne innodb status命令输出 的时候使用至I的文件,主要函数为srv_printf_innodb_monitor 0栈针:srv_dict_tmpfile (srvOstart.cc:2032):主要和外键创立信息输出有关一srv_misc_tmpfile (srv0start.cc:2041):主要和外键抛错输出有关.lockjatest_err_file (Iock0lock.cc:465):主要和死锁报错输出有关dict_foreign_err_file (dict0dict.cc:1245):主要和外键抛错输出有欠一我们可以发现实际上这些文件都不会占用太大,实际上这5个文件

5、初始化后就已经建立好了三一为什么Isof默认的输出会多很多很明显我们上面ib打头的文件只有5个那么我们Isof (不加任何参数)的时候看到的会多很多 呢?如下是我初始化旨动的情况下看到的个数:rootmgr2 support-files# lsofgrep deletegrep mysqlwc -1215rootmgr2 support-files# lsofgrep deletegrep mysql此处省略mysqld12916mysqllOuREG8,5976517109405mysqld12916mysqllluREG8,5023137683mysqld12916mysql12uREG8

6、,5023137684mysqld12916mysql13uREG8,5023137685mysqld12916mysql19uREG8,5023137686mysqld1291612920mysqllOuREG8,5976517109405mysqld1291612920mysqllluREG8,5023137683mysqld1291612920mysql12uREG8,5023137684mysqld1291612920mysql13uREG8,5023137685mysqld1291612920mysql19uREG8,5023137686mysqld1291612944mysqllO

7、uREG8,5976517109405mysqld1291612944mysqllluREG8,5023137683mysqld1291612944mysql12uREG8,5023137684mysqld1291612944mysql13uREG8,5023137685mysqld1291612944mysql19uREG8,5023137686mysqld1291612945mysqllOuREG8,5976517109405mysqld1291612945mysqllluREG8,5023137683mysqld1291612945mysql12uREG8,5023137684我们主要笑

8、注以下几歹II :PID : is the Process IDentification number of the process.TID : is the task (thread) IDentification numberFD : is the File Descriptor number of the file.SIZE/OFF : is the size of the file or the file offset in bytesNAME : is the name of the mount point and file system on which the file resi

9、des 更加详 细的自行参考man .从输出中我们可以发现PID都是12916这正是mysqld的PID,而它们的TID那么不同,这些当然就是多线程造成的原 因了 -FD和NAME实际上是有规律的重复的,其实只有5个值而已这代表我们上面说的5个临时 文件SIZE都比拟小c因此我们可以认为虽然输出多达215行,但是实际上整个MySQLD进程只翻开了5个文件而已 也就是我们前面说的那5个临时文件,这是因为线程间文件描述符(FD )是共享的,每一个线 程Isof查看的时候都会显示这5个临时文件,如果我们的MySQL有很多session -那么线程会很 多很多,那么Isof看到的临时文件数量就是线程数

10、据量*5 一因此我们在检查临时文件使用空间 情况的时候不要被过多的输出而吓到,我们只要输出MySQLD进程的临时文件即可,输出如 下:rootmgr2 proc# lsofgrep deletegrep mysqlAwk 1if($3=nmysql)printmysqld12916mysqllOuREG8, 5976517109405 /mysqld12916mysqllluREG8, 5023137683 /mysqld12916mysql12uREG8,5023137684 /mysqld12916mysql 13uREG8, 5023137685 /mysqld12916mysql19u

11、REG8, 5023137686 /或者加上Isof加上参数只看进程的临时文件,而不去查看子线程的临时文件rootmgr2 #lsof -p 12916grep deletemysqld 12916 mysqllOu REG8,59765 17109405/tmp/ibpuzts2 (dmysqld 12916 mysqlllu REG8,50 23137683/tmp/ibA4q9iX (dmysqld 12916 mysql12u REG8,50 23137684/tmp/ibRdXE14 (dmysqld 12916 mysql13u REG8,50 23137685/tmp/ibe6h

12、fHJ (dmysqld 12916 mysql19u REG8,50 23137686/tmp/ibfb7rps (d注意MySQL8O21下这些临时文件的名字有一些变化,Liunx下可能直接(O_TMPFILE flag )使 用这种方式建立如下:open(dirnAme_buf, O_RDWR | O_TMPFILE | O_CLOEXEC, S_工RUSR I S_IWUSR)我测试得到的名字如下:rootmgr4 # lsofgrep A.outgrep deleteMySQLD启动后查看的临时文件名如下:rootmgr4 # Isof -p 114 88grep deletemys

13、qld11488mysqllOuREG8,5024237413#2423741mysqld11488mysqllluREG8,5024237414/tmp/#2423741mysqld11488mysql12uREG8,5024237416/tmp/#2423741mysqld11488mysql19uREG8,5024237417/tmp/#24237411170311703root3uREG8Z 524237415 /虽然临时文件名有所变化,但是基本的用途和5.7差不多四-线程间的文件描述符(FD )是共享的这一段没什么好解释的借用Linux系统编程的一段说明如下:我们可以写一段简单的多线

14、程的代码来测试如下(不做任何错误判断)#include #include#include#include#include#include#include#includevoid* u_sleep(void* t)(chAr f ile_temp=n ibXXXXXX;int fd = mkstemp(file_temp);unlink( file_temp);int i = 0;chAr* teststr=nAAsdn;printf(theAd tmpfile: %snn,file_temp); for ( i = 0;i100000;i + +) write(fd,teststr,strle

15、n(teststr);)sleep (100);)int mAin(void)int ret = 0;pthreAd_t tid5;int i = 0;int fd = 0;int tid_num = 0;int tmp_file_num=5;chAr file_temp=n ibXXXXXX;for (i = 0;itmp_file_num;i + +)strcpy(file_tempz nibXXXXXX”);mkstemp(file_temp);printf(H %snn,file_temp);unlink( file_temp);for (i = 0;isizeof (tid)/siz

16、eof(pthreAd t) ;i + +)pthreAd_creAte(tid+tid_numz NULL,u_sleep,NULL);tid_num+;)for ( i = 0;isizeof(tid)/sizeof(pthreAd_t) ;i + +)ret = pthreAd_j oin( * (tid+i) , NULL );)这段代码实际上就是模拟在主进程中通过mkstemp和unlink建立了5个临时文件且也是以ib打 头(模拟MySQL的临时文件),然后建立了5个线程,每个线程再各自建立一个临时文件,写 点东西进去,然后线程睡眠一会,主线程会等待线程回收资源,因此可以有足够的时

17、间观察这样来观察是线程之间文件描述符(FD )是否共享,预期我们能够观察到的输出为60个主控线程主控线程5个子线程主控线程建立了5个临时文件6个线程共享就是30个然后每个子线程建立了 1个临时文件又是5个临时文件,6个线程共享又是30个)如下输出:rootmgr2 # lsof grep delete I grep a. out wc -160rootmgr2# lsofgrepdeletegrepA.outAwk rif($3=TTrootn)print rA . out13460root3uREG8,5043691141a . out13460root4uREG8,5043691142A

18、out13460root5uREG8,5043691144A , out13460root6uREG8,5043691145A , out13460root7uREG8,5043691146A . out13460root8uREG8,540000043691147A out13460root9uREG8,540000043691148A . OUt13460rootlOuREG8,540000043691149A . OUt13460rootlluREG8,540000043691150A . OUt13460root12uREG8,540000043691151rootmgr2A , out# .Zsof| grep13460delete greproot3uA.outmoreREG8,5043691141A . out13460root4uREG8,5043691142A , out13460root5uREG8,5043691144A . out13460root6uREG8,5043691145A , out13460root7uREG8,5043691146A . OU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论