文档章节

linux 下 Salt 命令的疑难杂症

-10
 -10
发布于 2015/02/04 18:07
字数 1011
阅读 116
收藏 0

http://hushi55.github.io/2015/01/22/linux-strace

前言

今天运维同事在使用

<pre> salt '*' test.ping </pre>

两台机器上的执行时间完全不同。正常的为:

<pre> [root@salt_master ~]# time salt-key -L Accepted Keys: 213 217 minion213 Unaccepted Keys: Rejected Keys: real 0m1.210s user 0m0.732s sys 0m0.339s </pre>

不正常的执行时间为:

<pre> [root@salt_master ~]# time salt-key -L Accepted Keys: 213 217 minion213 Unaccepted Keys: Rejected Keys: real 0m41.134s user 0m0.761s sys 0m0.318s </pre>

相差太大了,不能接受,需要找出原因。遇到这种疑难问题,strace 就派上用场了。

strace 的使用说明

首先我们看看 strace 的用法

<pre class="nowordwrap"> [root@perf01 ~]# strace --help strace: invalid option -- '-' usage: strace [-dDffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file] [-p pid] ... [-s strsize] [-u username] [-E var=val] ... [command [arg ...]] or: strace -c [-D] [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ... [command [arg ...]] -c -- count time, calls, and errors for each syscall and report summary -f -- follow forks, -ff -- with output into separate files -F -- attempt to follow vforks, -h -- print help message -i -- print instruction pointer at time of syscall -q -- suppress messages about attaching, detaching, etc. -r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs -T -- print time spent in each syscall, -V -- print version -v -- verbose mode: print unabbreviated argv, stat, termio[s], etc. args -x -- print non-ascii strings in hex, -xx -- print all strings in hex -a column -- alignment COLUMN for printing syscall results (default 40) -e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]... options: trace, abbrev, verbose, raw, signal, read, or write -o file -- send trace output to FILE instead of stderr -O overhead -- set overhead for tracing syscalls to OVERHEAD usecs -p pid -- trace process with process id PID, may be repeated -D -- run tracer process as a detached grandchild, not as parent -s strsize -- limit length of print strings to STRSIZE chars (default 32) -S sortby -- sort syscall counts by: time, calls, name, nothing (default time) -u username -- run command as username handling setuid and/or setgid -E var=val -- put var=val in the environment for command -E var -- remove var from the environment for command [root@perf01 ~]# </pre>

对于我们今天遇到的问题,我们重点关注下面的参数:

  • -f:跟踪包括 fork 的子进程。
  • -o file:输出跟踪的日志到一个文件中,而不是标准输出流中。
  • -T:打印系统调用的时间。

strace 的使用

我们使用下面的命令:

<pre> strace -f -T -o aa.txt salt '*' test.ping </pre>

我们得到的文本文件拷贝到 excel 中,按照 <,> 分列,使得系统调用时间在一列,然后使用 excel 的排序功能按照降序排列,我们可以看到下面的

<pre class="nowordwrap"> 4669 poll([{fd=3, events=POLLIN}], 1, 5000) = 0 (Timeout) 5.005197 4669 poll([{fd=3, events=POLLIN}], 1, 5000) = 0 (Timeout) 5.005197 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004221 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004221 4669 poll([{fd=4, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004206 4669 poll([{fd=4, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004206 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004201 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004201 4669 poll([{fd=4, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.00418 4669 poll([{fd=4, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.00418 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004177 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004177 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004166 4669 poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout) 5.004166 4669 select(0, NULL, NULL, NULL, {0, 25000}) = 0 (Timeout) 0.025196 4669 select(0, NULL, NULL, NULL, {0, 25000}) = 0 (Timeout) 0.025196 4669 select(0, NULL, NULL, NULL, {0, 25000}) = 0 (Timeout) 0.025184 4669 select(0, NULL, NULL, NULL, {0, 25000}) = 0 (Timeout) 0.025184 </pre>

发现 poll 系统调用中存在大量的超时,我们现在可以拷贝其中一个

<pre> 4669 poll([{fd=3, events=POLLIN}], 1, 5000) = 0 (Timeout) </pre>

到 aa.txt 中查找这个调用的上下文

<pre class="nowordwrap"> 4669 connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("202.96.199.133")}, 16) = 0 <0.000048> 4669 gettimeofday({1421912262, 387646}, NULL) = 0 <0.000038> 4669 poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}]) <0.000047> 4669 sendto(3, "K`\1\0\0\1\0\0\0\0\0\0\00234\003199\003106\003202\7in-a"..., 45, MSG_NOSIGNAL, NULL, 0) = 45 <0.000057> 4669 poll([{fd=3, events=POLLIN}], 1, 5000) = 0 (Timeout) <5.005197> 4669 socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4 <0.000059> 4669 connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("202.106.196.115")}, 16) = 0 <0.000051> 4669 gettimeofday({1421912267, 394615}, NULL) = 0 <0.000037> </pre>

可以注意到其中连个链接的 ip 地址

<pre> ... ... sin_addr=inet_addr("202.96.199.133") ... ... sin_addr=inet_addr("202.106.196.115") </pre>

这两个 ip 地址是这台 linux 上配置的 DNS,在主机上 ping 这俩个地址确实是 ping 不通,对比正常那台 linux 的 DNS 配置时,配置确实是不同的。修改到一致后,问题消失。至此使用 strace 调试问题也就完美结束了。

参考

© 著作权归作者所有

上一篇: byteman
下一篇: context switch 研究
-10

-10

粉丝 10
博文 10
码字总数 14996
作品 0
深圳
高级程序员
私信 提问
yum安装salt-ssh失败的解决

  yum安装salt-ssh报错: [root@linux-node1 yum.repos.d]# yum install salt-ssh -y已加载插件:fastestmirrorbase | 3.6 kB 00:00:00epel...

YuriGagarin
2018/06/26
0
0
salt-Arch Linux-install

ARCH LINUX INSTALLATION/安装 Salt (stable) is currently available via the Arch Linux Official repositories. There are currently -git packages available in the Arch User reposito......

王景帅
2018/06/26
0
0
Salt Stack 入门教程

Netkiller Linux 手札 Netkiller Linux Cookbook Mr. Neo Chan, 陈景峰 (BG7NYT) 版权 © 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Netkiller(Neo Chan). All rights reserved. 版权......

netkiller-
2013/09/23
8.2K
0
SaltStack Job 管理 及 saltutil.signal_job 模块的问题

原文链接:http://www.huangdc.com/66 1、什么是 Job 在salt 中,每次执行一次salt命令就会产生一个Job ,Salt 实时管理的任务都是作为Job来执行的;在maste执行一次salt 命令,minion 就会产...

dchuang
2015/08/09
455
0
salt-Debian GNU/Linux / Raspbian-install

DEBIAN GNU/LINUX / RASPBIAN Debian GNU/Linux distribution and some derivatives such as Raspbian already have included Salt packages to their repositories. However, current stabl......

王景帅
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈Visitor访问者模式

一、前言 什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么...

青衣霓裳
27分钟前
6
0
JS内嵌多个页面,页面之间如何更快捷的查找相关联的页面

假设parent为P页面, P页面有两个子页面,分别为B页面和C页面; B页面和C页面分别内嵌一个iframe,分别为:D页面和E页面 现在通过B页面的内嵌页面D的方法refreshEpage(eUrl)来加载内嵌页面E的内容...

文文1
28分钟前
7
0
Hibernate 5 升级后 getProperties 错误

升级到 Hibernate 5 后,提示有错误: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map; 完整的错误栈为: java.lang.NoSuchMethodError: org.hibernate......

honeymoose
29分钟前
6
0
mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
32分钟前
6
0
Spring中BeanFactory与FactoryBean的区别

在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混。 一、BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定...

大王叫下
35分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部