幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

从MySQL源码看其网络IO模型

  从MySQL源码看其网络IO模型前言
  MySQL是当今最流行的开源数据库,阅读其源码是一件大有裨益的事情(虽然其代码感觉比较凌乱)。而笔者阅读一个Server源码的习惯就是先从其网络IO模型看起。于是,便有了本篇博客。
  MySQL启动Socket监听
  看源码,首先就需要找到其入口点,mysqld的入口点为mysqldmain,跳过了各种配置文件的加载
  之后,我们来到了networkinit初始化网络环节,如下图所示:
  下面是其调用栈:mysqldmain(MySQLServerEntryPoint)
  networkinit(初始化网络)
  建立tcp套接字
  createsocket(AFINET)
  mysqlsocketbind(AFINET)
  mysqlsocketlisten(AFINET)
  建立UNIX套接字
  mysqlsocketsocket(AFUNIX)
  mysqlsocketbind(AFUNIX)
  mysqlsocketlisten(AFUNIX)
  值得注意的是,在tcpsocket的初始化过程中,考虑到了ipv4v6的两种情况:首先创建ipv4连接
  ipsockcreatesocket(ai,AFINET,a);
  如果无法创建ipv4连接,则尝试创建ipv6连接
  if(mysqlsocketgetfd(ipsock)INVALIDSOCKET)
  ipsockcreatesocket(ai,AFINET6,a);
  如果我们以很快的速度stopstartmysql,会出现上一个mysql的listenport没有被release导致无法当前mysql的socket无法bind的情况,在此种情况下mysql会循环等待,其每次等待时间为当前重试次数retryretry31秒,一直到设置的portopentimeout(默认为0)为止,如下图所示:
  MySQL新建连接处理循环
  通过handleconnectionssockets处理MySQL的新建连接循环,根据操作系统的配置通过pollselect处理循环(非epoll,这样可移植性较高,且mysql瓶颈不在网络上)。
  MySQL通过线程池的模式处理连接(一个连接对应一个线程,连接关闭后将线程归还到池中),如下图所示:
  对应的调用栈如下所示:handleconnectionssockets
  pollselect
  newsockmysqlsocketaccept(。。。sock。。。)从listensocket中获取新连接
  newTHD连接线程上下文如果获取不到足够内存,则shutdownnewsock
  mysqlsocketgetfd(sock)从socket中获取
  设置为NONBLOCK和环境有关
  fcntl(mysqlsocketgetfd(sock),FSETFL,flagsONONBLOCK);
  mysqlsocketvionew
  vioinit(VIOTYPETCPIP)
  (viowriteviowrite)
  默认用的是vioread
  (vioread(flagsVIOBUFFEREDREAD)?vioreadbuff:vioread;)
  (vioviokeepaliveviokeepalive)tcp层面的keepalive
  。。。。。
  mysqlnetinit
  设置超时时间,最大packet等参数
  createnewthread(thd)实际是从线程池拿,不够再新建pthread线程
  最大连接数限制
  createthreadtohandleconnection
  首先看下线程池是否有空闲线程
  mysqlcondsignal(CONDthreadcache)有则发送信号
  这边的hanldeoneconnection是mysql连接的主要处理函数
  mysqlthreadcreate(。。。handleoneconnection。。。)
  MySQL的VIO
  如上图代码中,每新建一个连接,都随之新建一个vio(mysqlsocketvionewvioinit),在vioinit的过程中,初始化了一堆回掉函数,如下图所示:
  我们关注点在vioread和viowrite上,如上面代码所示,在笔者所处机器的环境下将MySQL连接的socket设置成了非阻塞模式(ONONBLOCK)模式。所以在vio的代码里面采用了nonblock代码的编写模式,如下面源码所示:
  vioreadsizetvioread(Viovio,ucharbuf,sizetsize)
  {
  while((retmysqlsocketrecv(viomysqlsocket,(SOCKBUFT)buf,size,flags))1)
  {
  。。。。。。
  如果上面获取的数据为空,则通过select的方式去获取读取事件,并设置超时timeout时间
  if((retviosocketiowait(vio,VIOIOEVENTREAD)))
  break;
  }
  }
  即通过while循环去读取socket中的数据,如果读取为空,则通过viosocketiowait去等待(借助于select的超时机制),其源码如下所示:viosocketiowait
  vioiowait
  (retselect(fd1,readfds,writefds,exceptfds,
  (timeout0)?tm:))
  笔者在jdk源码中看到java的connectiontimeout也是通过这,select(waittime)的方式去实现连接超时的。
  由上述源码可以看出,这个mysql的readtimeout是针对每次socketrecv(而不是整个packet的),所以可能出现超过readtimeoutMySQL仍旧不会报错的情况,如下图所示:
  viowrite
  viowrite实现模式和vioread一致,也是通过select来实现超时时间的判定,如下面源码所示:sizetviowrite(Viovio,constucharbuf,sizetsize)
  {
  while((retmysqlsocketsend(viomysqlsocket,(SOCKBUFT)buf,size,flags))1)
  {
  interrorsocketerrno;
  Theoperationwouldblock?
  处理EAGAIN和EWOULDBLOCK返回,NONBLOCK模式都必须处理
  if(error!SOCKETEAGAINerror!SOCKETEWOULDBLOCK)
  break;
  Waitfortheoutputbuffertobecomewritable。
  if((retviosocketiowait(vio,VIOIOEVENTWRITE)))
  break;
  }
  }
  MySQL的连接处理线程
  从上面的代码:mysqlthreadcreate(。。。handleoneconnection。。。)
  可以发现,MySQL每个线程的处理函数为handleoneconnection,其过程如下图所示:
  代码如下所示:for(;;){
  这边做了连接的handshake和auth的工作
  rcthdprepareconnection(thd);
  和通常的线程处理一样,一个无限循环获取连接请求
  while(thdisconnectionalive(thd))
  {
  if(docommand(thd))
  break;
  }
  出循环之后,连接已经被clientdu端关闭或者出现异常
  这边做了连接的销毁动作
  endconnection(thd);
  endthread:
  。。。
  这边调用endthread做清理动作,并将当前线程返还给线程池重用
  endthread对应为onethreadperconnectionend
  if(MYSQLCALLBACKELSE(threadscheduler,endthread,(thd,1),0))
  return;
  。。。
  这边currentthd是个宏定义,其实是currentthd;
  主要是从线程上下文中获取新塞进去的thd
  mypthreadgetspecificptr(THD,THRTHD);
  thdcurrentthd;
  。。。
  }
  mysql的每个woker线程通过无限循环去处理请求。
  线程的归还过程
  MySQL通过调用onethreadperconnectionend(即上面的endthread)去归还连接。MYSQLCALLBACKELSE(。。。endthread)
  onethreadperconnectionend
  thdreleaseresources
  。。。。。。
  blockuntilnewconnection
  线程在新连接尚未到来之前,等待在信号量上(下面代码是CCmutexcondition的标准使用模式):staticboolblockuntilnewconnection
  {
  mysqlmutexlock(LOCKthreadcount);
  。。。。。。
  while(!abortloop!wakepthread!killblockedpthreadsflag)
  mysqlcondwait(x1,LOCKthreadcount);
  。。。。。。
  从等待列表中获取需要处理的THD
  thdwaitingthdlistfront;
  waitingthdlistpopfront;
  。。。。。。
  将thd放入到当前线程上下文中
  mypthreadsetspecificptr(THRTHD,this)
  thdstoreglobals;
  。。。。。。
  mysqlmutexunlock(LOCKthreadcount);
  。。。。。
  }
  整个过程如下图所示:
  由于MySQL的调用栈比较深,所以将thd放入线程上下文中能够有效的在调用栈中减少传递参数的数量。
  总结
  MySQL的网络IO模型采用了经典的线程池技术,虽然性能上不及reactor模型,但好在其瓶颈并不在网络IO上,采用这种方法无疑可以节省大量的精力去专注于处理sql等其它方面的优化。

常吃泡面真的容易得癌?不要再轻信谣言了,泡面真正的危害是这些泡面算是家喻户晓的速食产品,味道香,价格实惠,不少家庭都会预备上几包,等着不想开火做饭的时候,就随便拿来充饥。按道理,泡面是很实惠的东西,风评应该会很不错。但是,现实里却有不少……宝宝打与被打都是社交的一种需要李老师您好,我的孩子1岁半啦,经常打小朋友和妈妈怎么办,但不是生气的情绪,而是很开心的状态这是为什么?该如何去对待她呢?在这样的情绪中我们应该这样来分析:一、孩子们……130万人热议!有一个戏精婆婆,是怎样的体验?爸妈营婆媳关系中国式婚姻的第一雷区。触雷概率百分之百。所以,知乎上的热门问答里,永远有婆媳关系的一席之地。婆媳关系一定是一门及其深奥的学科,因为光问题总数,就达到了惊人的……6个月婴儿经常抓耳朵是生病象征?背后诱因,做父母的要知道当代作家舒天丹曾说:教育孩子就如同养育花朵,精心浇水,施肥,呵护方能成功。但事实上并不是所有人都能成功,不懂就要向别人请教。是啊,很多刚升级成为宝妈的人,在养育孩子这一方面就如……翻来覆去睡不着?你想要知道的快速入睡小技巧都在这里当值编辑君君每天晚上,当各种各样的想法充斥在脑海中时,睡着是件非常困难的事,更不用说迅速入睡了。然而,想要迅速入睡并不是没有可能,只要对生活习惯做一些细微的改变就可……教育部的通知来了,部分考生或将与高考无缘,2022高考生要注高考总是受到社会各界的广泛关注,不单是因为这是能够影响考生一生的考试,也在于高考是公平公正的,一切凭考生的实力说话。高考是一块验金石,能够反映出考生在过去多年是否努力,努……高考语文高考诗歌鉴赏解析!看近几年高考题目,如果是你怎么写阅读下面这首诗,完成1920题。(8分)采地黄者白居易麦死春不雨,禾损秋早霜。岁晏无口食,田中采地黄。采之将何用?持以易糇粮。凌晨荷插去,薄暮不盈筐。携来朱门……拒绝冷暴力,这些被家长忽视的行为,你对孩子做过吗?家长们可能会忽略生活中存在的另一种常见暴力冷暴力比起肉体上的虐待冷暴力带给孩子的更多是心灵上的伤痕1、这些都属于冷暴力范畴看到冷暴力三……德江县实验中学召开干部队伍作风突出问题整顿工作动员部署会8月4日下午,德江县实验中学在学校礼堂召开干部队伍作风突出问题整顿工作动员部署会,德江县委第三巡回督导组到会指导。会议宣读了《德江县实验中学干部队伍作风突出问题整顿工作方……养父母也爱孩子,被领养的子女感受了双倍的爱在美国,一些无法生育的夫妇会领养一个相对贫困的国家的孩子,以此来完成自己的育儿梦想。如今31岁的玛丽拉安德森(MarielaAndersen),就是这样一个被领养的孩子。……20202021年最具价值的美国大学专业排名发布对大多数中国学生和家长而言,排名一直是大家选择学校的重要参考指标。对于留美一族来说,毫无疑问,U。S。News绝对是至上法宝。小伙伴们在选择大学的时候,除了要考虑教授水平……孩子爱吃的糖醋肉圆,酸甜营养,美味解馋,吃一次念念不忘大家好,这里是杨爸的育儿经,主题介绍简单的育儿辅食和育儿知识,只为分享对孩子更好的。本款美食适合3周岁以上的孩子品尝。在家常菜的范畴之中,相信大部分人对于肉圆这款美食应该……
法国爱达力奶粉入华8年,CBME孕婴童展上拿下双料大奖进入中国8年,法国爱达力奶粉就已覆盖中国27个省市自治区,成为进口奶粉的重要一员,这背后离不开倍嘉国际的努力。10月12日,为期三天的第20届CBME中国孕婴童展正式落幕,爱达……年三十生孩子,可没那么美好做好这五点准备,春节也能坐好月子伴着年三十跨年钟声诞生的新年宝宝,总是受到几乎所有新闻媒体的关注,是每年各大电视台的一大重点喜庆新闻。宝爸宝妈和医护人员,面对镜头的那一份灿烂微笑,是新年里感染大家的一份……花孔雀金子轩金子轩是兰陵金氏家主金光善的嫡子,唯一的嫡子,金光善估计是唯一成功的俩,就是有了金子轩和有手段的当家主母。金子轩,相貌出众,正直善良,性格非常高傲,世家公子排名第三,是世……妈妈喊我和她睡一起,把我房间锁起来,原因让我感动哭了!其实从我们开始读书都开始自己单独睡了,因为爸爸妈妈有自己的空间,我也有我的私人空间,大家各自有秘密,但我睡的床总感觉好小,妈妈老是担心我会摔下来,看着他们每天都为我担心,我就想……河南高考生真幸福,125万人中20。4万人被提前录取,有先见众所周知,21年的高考生总人数有突破历史高峰,根据数据统计总高考生人数约1078万人,其中复读生人数占187万人。而高校总数就这样多,恐怕今年考生报考会更加艰难。对于河南……捏捏乐尖叫鸡磁力泥哪种减压玩具真有用?实验见真相生活的琐事、工作的烦恼是不是时常让你感到压力山大?想发泄压力也许你可以了解下玩具市场的新宠解压玩具什么是解压玩具?这类玩具质量怎么样?……在这4种家庭里,孩子将来成才的概率会更高!父母再忙也要读一读中国农民古谚语里曾说:杂草铲除要趁早,孩儿教育要从小。在孩子的教育中,我们常说的两个最大的成分就是家庭的教育和学校的教育;而家庭教育往往优先于学校教育,因为孩子出生后一段……孕早期出现这5种情况,可能会诱发ampampquot胎停am胎儿在妈妈肚子里的时候就深受妈妈的期待,这是一位母亲即将为人母的美好期许。从胎心的第一次跳动到完成跟宝宝的第一次互动,无时不刻不牵绊着妈妈的心。胎儿健康发育是妈妈的……核心教育理念学习即认知世界(这篇文章是再一次把自己的教育理念写出来,让可能成为我的学生的孩子和家长们可以参考。熟悉我的朋友已经知道了,不熟悉的,还是认真看一下,特别是希望获得一种主流的教育理念的时候。)……层次越低的女人,总爱说这些话,容易祸从口出一个层次低的女人,开口闭口总爱说这些话,还是保持距离为好前言:社会上我们每个人都不同,也分三六个等级,有的人接触一下就会发现这个人没有什么内涵,有的女人……缓解宝宝夜奶,多喝优博瑞慕就对了宝宝出生是一件非常开心的事情,毕竟家里多了个小可爱,新手爸妈十分的开心。不过许多新手爸妈在抚育孩子的过程中会遇到很多问题,像是宝宝们经常会要喝夜奶,新手爸妈只好迁就孩子,半夜起……荔枝壳不要扔,放锅里一煮,每周坚持喝3次,很多人不知道有啥用荔枝壳不要扔,放锅里煮一煮,每周坚持喝3次,很多人不知道有啥用!又到了荔枝大量上市的季节了,大街小巷超市随处可见,其甜嫩多汁,是很多人特别喜欢的一款水果,但是大家在吃荔枝……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网