记一次nf_conntrack模块导致的丢包问题
一、背景我们灰度线上业务的时候,有一次遇到了业务反馈资源没有读写,当时正好将流量切到了线上的一台机器上,在将业务的资源迁移回滚之后,经过一番查找,发现/var/log/message中打印了很多关于kernel: nf_conntrack: table full, dropping packet的错误信息,网上查找了一下,这个错误主要是由于启用了nf_conntrack模块,之前很多人都遇到了这个问题,解决方案也很多,这里以我的角度详细记录一下,/var/log/message中错误信息如下: Jul 30 11:50:01 dbl14192 systemd: Starting Session 486429 of user root.Jul 30 11:50:02 dbl14192 kernel: nf_conntrack: table full, dropping packetJul 30 11:50:02 dbl14192 kernel: nf_conntrack: table full, dropping packetJul 30 11:50:02 dbl14192...
Perf与火焰图
一、PerfPerf 是基于Linux 2.6+系统的一款性能分析工具。它可以用来分析应用程序和内核的性能问题,从而全面理解应用程序中的性能瓶颈。 [root@bugwz ~]# perf --help usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS] The most commonly used perf commands are: annotate Read perf.data (created by perf record) and display annotated code archive Create archive with object files with build-ids found in perf.data file bench General framework for benchmark suites buildid-cache Manage build-id cache. buildid-list ...
漏桶与令牌桶速率限制算法
一、漏桶算法漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。示意图如下所示: 1.1、算法过程 数据包入队列:数据包按照一定的顺序存储入用于临时存储的缓存队列(数据桶)中; 数据包等待或溢出:数据包在缓存队列(数据桶)中等待一段时间,或者如果此时缓存队列(数据桶)已经达到存储的上限,数据包溢出(被丢弃); 数据包出队列:将缓存队列(数据桶)中的数据包按照固定的速率依次出队列并进行处理; 1.2、特点 优点: 能够强行限制数据的传输速率; 保证严格的延迟界限; 缺点: 对突发性的流量缺乏处理效率; 1.3、相关项目 Nginx中关于漏桶的设计与实现:ngx_http_limit_req_module...
Redis的Memory命令讲解
一、简述Memory指令是Redis4.0版本更新的特性,可用于详细的分析内存的使用情况,内存使用诊断,内存碎片回收等工作; 可以通过memory help指令打印出memory指令的信息,详细信息如下所示: 1) MEMORY <subcommand> arg arg ... arg. Subcommands are:2) DOCTOR - Return memory problems reports.3) MALLOC-STATS -- Return internal statistics report from the memory allocator.4) PURGE -- Attempt to purge dirty pages for reclamation by the allocator.5) STATS -- Return information about the memory usage of the server.6) USAGE <key> [SAMPLES <count>] -- Return memory in...
TCL语言入门
一、简述Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,一条TCL的命令串包含若干条命令,命令使用换行符或分号来隔开;而每一条命令包含若干个域(field),域使用空白(空格或TAB)来隔开——第一个域是命令的名字,其它的域是该命令的参数。 二、基本语法2.1、注释注释在调试的过程中轻常碰到。TCL语言的注释符号是 # ,加在每一行的最前面。 2.2、脚本、命令、单词一个TCL 脚本 可以包含一个或多个 命令 。 命令 之间必须用换行符或分号隔开,推荐使用换行符分开。下面就是一个合法的TCL 脚本 ,它由两个赋值 命令 组成; set a 1set b 2 TCL的每一个 命令 包含一个或几个 单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用 空格 或 TAB键 隔开。上面代码中的 set , a , 1 分别是三个单词。 TCL解释器对一个 命令 的求值过程分为两部分:分析和执行; 在分析阶段,TCL 解释器运用规则把 命令 分成一个个独立的单词,同时进行必要的 置换(substitution) ; 在执行阶段,TCL...
localtime函数死锁分析
一、简介前段时间,线上的redis实例出现了一些异常的情况,具体变现就是bgsave子进程hang住了,从而引发了后续的很多问题,通过排查最终发现是localtime相关函数引起的,这里做一下总结记录。 C 库函数 *struct tm *localtime(const time_t timer) 作用是根据本地时区信息将 time 函数获取的 UTC 时间调整为为本地时间,并将具体的时间信息填充到tm结构体之中; 二、详细介绍由于localtime函数的具体底层实现的缘由,在某些场景下会触发localtime函数导致的死锁问题,这里详细的分析原因以及后续的处理方案; 2.1 底层实现分析localtime函数底层的调用栈信息为: localtime() => __tz_convert() localtime 函数的底层代码实现(代码位于./time/localtime.c): /* Return the `struct tm' representation of *T in local time. */struct tm *localtime...
Clang-Format格式化工具
Clang-Format 是基于 clang 的一个命令行工具,这个工具能够自动化格式 C/C++/Obj-C 代码,支持多种代码风格(Google, Chromium, LLVM, Mozilla, WebKit),同时也支持自定义风格(通过编写.clang-format文件),这里记录了常用的配置 Clang-Format 常用的配置项及其含义。 一、安装方式# macbrew install clang-format 二、参数解析官方文档的参数解析为:http://clang.llvm.org/docs/ClangFormatStyleOptions.html 2.1 参数解析BasedOnStyle样式信息: LLVM:一种遵循LLVM coding standards的样式; Google:一种遵循Google’s C++ style guide的样式; Chromium:一种遵循Chromium’s style guide的样式; Mozilla:一种遵循Mozilla’s style...
hashlimit-Iptables笔记
一、简介hashlimit是iptables的一个匹配模块,用它结合iptables的其它命令可以实现限速的功能。注意:单独hashlimit模块是无法进行限速的; 二、原理介绍实际上,使用 hashlimit 进行限速主要包括两个步骤: 对符合 hashlimit 匹配规则包放行 丢弃/拒绝未放行的包 2.1 令牌桶模型hashlimit 的匹配方式是基于令牌桶(Token bucket)的模型,令牌桶是一种网络通讯中常见的缓冲区工作原理,它有两个重要的参数,令牌桶容量n和令牌产生速率s; 令牌桶容量n:可以把令牌当成是门票,而令牌桶则是负责制作和发放门票的管理员,它手里最多有n张令牌。初始时,管理员开始手里有n张令牌,每当一个数据包到达后,管理员就看看手里是否还有可用的令牌。如果有,就把令牌发给这个数据包,hashlimit 就告诉iptables,这个数据包被匹配了,而当管理员把手上所有的令牌都发完了,再来的数据包就拿不到令牌了;这时,hashlimit 模块就告诉 iptables...
Linux内核软件框架-Netfilter概述
一、简述Netfilter是Linux内核中的一个软件框架,用于管理网络数据包。不仅具有网络地址转换(NAT)的功能,也具备数据包内容修改、以及数据包过滤等防火墙功能。利用运作于用户空间的应用软件,如iptables等,来控制Netfilter,系统管理者可以管理通过Linux操作系统的各种网络数据包。1990年代,Netfilter在Linux 2.3.15版时进入Linux内核,正式应用于Linux 2.4版。 现今许多市面上许多的IP分享器或无线网络路由器(Wireless...
PrettyTable-Python使用笔记
一、简述PrettyTable是一个简单的Python库,旨在快速,轻松地在视觉上吸引人的ASCII表中表示表格数据。 它的灵感来自PostgreSQL shell psql中使用的ASCII表。 PrettyTable允许选择要打印的列,列的独立对齐(左对齐或右对齐或居中)以及通过指定行范围打印“子表”。GitHub 二、安装与使用# 安装:使用pip可以方便的安装PrettyTablepip install PrettyTable# 使用:python代码中引入该库import prettytable as pt 三、相关API介绍3.1、创建表3.1.1、普通创建表:import prettytable as pttb = pt.PrettyTable() 3.1.2、从已有的文件中创建# 【利用CSV文件创建】# + 变量pt将是一个完全填充的PrettyTable对象;# + CSV文件的第一行将被解释为字段名称并用于表头;# + 可以通过传递“field_names”关键字参数来指定自己的字段名称;from prettytable import...