ZBLOG

mysqld正常运转时按照以下3种场景进行刷脏: while (srv_shutdown_state == SRV_SHUTDOWN_NONE){ if (ret_sleep == OS_SYNC_TIME_EXCEEDED) { /*如果此次刷脏页的当前时间 > next_loop_time+3000,则输出日志到错误日志,并重置下一次next_loop_time、n_flushed_last、n_evicted*/ ulint c...

这段代码是InnoDB存储引擎中的一部分,主要用于处理脏页(dirty pages)的刷写。脏页是指在内存中被修改但尚未写入磁盘的页面。在MySQL数据库中,定期将这些脏页刷新到磁盘对于保证数据的一致性和性能非常重要。

以下是对代码逻辑的简要分析:

  1. 循环条件while (srv_shutdown_state == SRV_SHUTDOWN_NONE) 这个循环会持续运行,直到服务关闭状态变为非正常状态。

  2. 时间检查

    • 检查是否超过了设定的刷脏周期,如果超过3000毫秒,则记录警告并重置计数器。
    • 更新下一次刷脏的预期时间 next_loop_time
  3. 活动检查

    • 使用 srv_check_activity(last_activity) 函数来检测是否有活跃线程。
    • 如果系统繁忙(有阻塞I/O或当前无待刷脏页),则会调用 pc_sleep_if_needed() 暂停1秒以避免对业务造成影响。
  4. 刷脏操作

    • 如果启用了同步刷脏且存在待刷的LSN(Log Sequence Number),会请求刷写指定数量的脏页。
    • 否则,根据当前活动线程的情况选择适当数量的脏页进行刷写。
  5. 空闲状态下的刷新

    • 当没有活跃线程时,可以按照配置最大限度地进行刷新,以清理内存中的脏数据。
  6. 结果更新

    • 每次成功刷新后,会更新相关统计信息,以便后续使用和监控性能。

整个流程旨在高效、合理地管理内存中的脏页,并尽量减少对数据库其他操作的影响。这种设计可以帮助确保在高负载情况下系统依然保持稳定与高效。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6802

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?