tcpdump抓包利器,编写网络程序的时候必须会用啊。几个常用的选项记住了以后方便些:
tcpdump -ieth1 -Xlns0 'tcp port 19999 and ip[52:4] != 100'
-i eth1 指定监听的端口
-X 除掉以太网层的包头,都显示出来,这样的话,看到的就是4500开头的东西了,这是ip包头开始的。同时会包的内容以十六进制显示出来,这个一定要加晒。Print each packet (minus its link level header) in hex and ASCII.
-l 使用行缓冲,这里话所见既所得,避免缓冲区刷新导致看不到的情况。Make stdout line buffered.
-n 不要进行ip到域名这种转换,加上快一些。Don't convert addresses (i.e., host addresses, port numbers, etc.) to names.
-p 加上避免包乱序。一般还好。Don't put the interface into promiscuous mode. Note that ...
源于:http://www.gnu.org/s/hello/manual/make/Phony-Targets.html
A phony target is one that is not really the name of a file; rather it is just a name for a recipe to be executed when you make an explicit request. There are two reasons to use a phony target: to avoid a conflict with a file of the ...
strdup/strndup/ 由于字符串的内存是动态分配的,需要使用者自己来释放。
char *strdup(const char *s);
char *strndup(const char *s, size_t n);
The strdup() function returns a pointer to a new string which is a duplicate of the strings.
Memory for the new string is obtained with malloc(3), and can be freed with free(3).
strncpy 要保证dest的长度要足够,否则字符串没有结束符
char *strncpy(char *dest, const char *src, size_t n);
The strncpy() function is similar, except that ...
程序的执行分终端执行以及系统执行,前台执行和后台执行。
前台执行的话,ctrl+c就会干掉这个程序,常常加个&来后台执行,通过jobs、bg、fg这些命令来切换。
后台执行的话在当前终端开启的情况下有效。
如果希望退出当前中断,如logout、exit后,程序依然执行,需要使用at命令或者nohup了,这样即使退出终端照样执行。
nohup 程序名字 &
nohup不支持内建的命令,需要封装一下才行。
nohup的输出回到~/nohup.out里面去。
RAID:Redundant Array of Independent Disk独立冗余磁盘阵列
RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术。
通过软件或者硬件的手段将多块硬盘放在一起来实现:加快访问 + 数据的冗余备份 + 加大存储容量
RAID0:至少2个磁盘,加大存储容量,分块存储在不同的磁盘上,读写速度加快,无冗余。
RAID1:镜像,至少2个磁盘,一个盘是另外一个盘的镜像,容量少了一半,安全可靠,写入较慢,读取相当于当个磁盘。
RAID5:RAID0和RAID1的综合,在容量、速度、安全方面寻找均衡。至少3个磁盘,一个磁盘用于存储奇偶校验信息,浪费了1/N的容量,换来了安全可靠,读取的速度变快,写入慢了一些,每次写有四次读写操作。两次读出来原来的数据和校验信息,两次写入新的数据和校验信息。
RAID10:先镜像,再分区。是将所有硬盘分为两组,视为是RAID 0的最低组合,每组是另外一组的镜像。读取速度会快一些,不过至少需要4个以上的偶数硬盘才行。
有的时候会把md5这种16个字节的字符串,通过两个big int类型的数字来存放,这样查询会快一些,不过当得到一个md5后来进行查询就不是很方便了。幸好mysql提供了诸多的函数可以方便的实现你想要的内容:
1 通过set来设置一个md5的变量
2 后续通过left和right两个函数来取得前后的8个字节,通过conv转换为10进制,可以方便的实现比较
set @md5_var='315a6e9d2114d67c75f684a9f8638413';select count(*) from *** where md1=conv(left(@md5_var, 16), 16, 10) and md2=conv(right(@md5_var, 16), 16, 10);
导读:原文作者Kevin Pang在kevinwilliampang.com发表一篇《10 Programming Proverbs Every Developer Should Know》。译文由伯乐在线整理编译成《10句编程箴言 每个程序员都应该知道》。文章内容如下:
所谓谚语,就是用言简意赅、通俗易懂的方式传达人生箴言和普遍真理的话,它们能很好地帮助你处理生活和工作上的事情。也正因如此,我才整理了10句编程谚语,每位开发人员都应该铭记他们,武装自己。
1. 无风不起浪
别紧张,这也许只是一场消防演习
代码设计是否糟糕,从某些地方就可以看出来。比如:
a. 超大类或超大函数
b. 大片被注释的代码
c. 逻辑重复
d. If/else嵌套过深
程序员们通常称它们作代码异味(Code Smell),但是就我个人认为“代码警报”这个名字更为合适一些,因为它有更高的紧迫感的含义。根本问题处理不当,终将引火烧身。
译注:Code Smell中文译名一般为“代码异味”,或“代码味道”,它是提示代码中某个地方存在错误的一个暗示,开发人员可以通过这种smell(异味)在代码中追捕到问题。
2. 预防为主,治疗为辅
好吧,我相信了!
20世纪80年代,丰田公司的流水作业线因为它在缺陷预防方法上的革新变得出了名的高效。每个发现自己的部门有问题的成员都有权暂停生产。这个方法意在宁可发现问题后马上暂定生产、解决问题,也不能由其继续生产而导致更棘手且更高代价的修复/更换/召回后的问题。
程序员总会做出生产率就等同于快速编码的错误臆断。许多程序员都会不假思索地直接着手代码设计。可惜,这种Leeroy Jenkins式鲁莽的做法多会导致软件的开发过程变得很邋遢,拙劣的代码需要不断的监测和修改——也可能会被彻底地替换。最终,生产率所涉及到的因素就 不仅仅是写代码所消耗的时间了,还要有调试的时间。稍不留神就会“捡了芝麻丢了西瓜”。(因小失大。)
译注:Leeroy Jenkins 行为:WOW游戏中一位玩家不顾大家独身一人迎敌,导致灭团。
3. 不要孤注一掷 (过度依赖某人)
一个软件开发团队的公共要素(bus factor)是指那些会影响整个项目进程的核心开发人员的总数。比如某人被车撞了或某人生孩子或某人跳槽了,项目可能就会无序,甚至会搁置。
译注: bus factor 即指公共要素,比喻了开发过程中的一些共同因素。如果挤上 bus 的 factor 越多,bus 就越不稳定,所以要控制好 bus factor ,以免问题发生。
换句话说,如果你的团队突然失去了一个主力成员,你会怎么办?生意依旧进行还是戛然而止?
很不幸,大多数软件团队都陷入了后一种情况。这些团队把他们的开发员培养成了只会处理他们自己专业领域的“领域专家”。起初,这看起来是一个比较合 理的方法。它 对汽车制造装配生产线很适用,但是为什么对软件开发团队就不行呢?毕竟,想让每个成员都掌握所编程序的细微差别也不太可能,对吧?
问题是开发人员不容易轻易替换掉。虽然当每位成员都可用时,“抽屉方法”很有效,但如果当“领域专家”突然因人事变动、疾病或突发事故而无法工作 时,抽屉 方法立马土崩瓦解。(所以,)软件团队有一些看似多余实则重要的后备力量是至关重要。代码复查、结对编程和共有代码可用成功营造一个环境,在这个环境中, 每位开发人员至少表面上是熟悉自己非擅长领域之外的系统部分。
4. 种瓜得瓜,种豆得豆
《注重实效的程序员》一书中有这样一段话解释“破窗理论”:不要留着“破窗户”(低劣的设计、错误的决策或者糟糕的代码)不修。发现一个就修一个。 如果没有足够的时间进行适当的修理,就先把它保留起来。或许你可 以把出问题的代码放到注释中,或是显示“未实现”消息,或用虚拟数据加以替代。采取一些措施,防止进一步的恶化。这表明局势尚在掌控之中。
我们见过整洁良好的系统在出现“破窗”之后立马崩溃。虽然促使软件崩溃的原因还有其他因素(我们将在其他地方接触到),但(对“破窗”)置之不理,肯定会更快地加速系统崩溃。
简而言之,好的代码会促生好的代码,糟糕的代码也会促生糟糕的代码。别低估了惯性的力量。没人想去整理糟糕的代码,同样没人想把完美的代码弄得一团糟。写好你的代码,它才更可能经得住时间的考验。
译注:《注重实效的程序员》,作者Andrew Hunt/David Thomas。该书直击编程陈地,穿过了软件开发中日益增长的规范和技术藩篱,对核心过程进行了审视――即根据需求,创建用户乐于接受的、可工作和易维护 的 代码。本书包含的内容从个人责任到职业发展,直至保持代码灵活和易于改编重用的架构技术。从本书中将学到防止软件变质、消除复制知识的陷阱、编写灵活、动 态和易适应的代码、避免出现相同的设计、用契约、断言和异常对代码进行防护等内容。
译注:破窗理论(Broken Window theory):是关于环境对人们心理造成暗示性或诱导性影响的一种认识。“破窗效应”理论是指:如果有人打坏了一幢建筑物的窗户玻璃,而这扇窗户又得不 ...
关注网络的三个层次:
以太网层、网络层、传输层(UDP/TCP)
相关的命令:(以太网层)ethtool、mii-tool、(查看包情况)ifconfig、ip、sar、netstat
查看网卡带宽:
Ethtool 网卡编号
Ethtool eth0
查看和设置mtu:ifconfig
Ifconfig的一些重要的信息:这些统计数据是从机器启动时就开始计算的了
RX:接收到的包数量
TX:发送的包的数量
Errors:错误包的数量
Dropped:丢包的数量(后台服务器来说这个比较重要)
Overruns:网卡缓冲区不够用或者内核忙不过来的次数(后台服务器来说这个比较重要)
Frame:以太网上帧错误的数量、如crc校验失败
Carrier:链路层的包错误量
txqueuelen 是传输缓区长度大小(发送队列的大小,对于高速网络,建议把这个值设置大一些,还有一个比较重要的参数是接收队列netdev_backlog ,高速网络下也建议设置大一点,避免tcp因为丢包而开启的拥塞控制。对于1G的网卡,txqueuelen设置为1000比较合理)
语 法:ifconfig [网络设备][down up -allmulti -arp -promisc][add<地址>][del<地址>][<网络设备类型> <硬件地址>][io_addr][irq ][media<网络媒介类型>][mem_start<内存地址>][metric<数目>][mtu<字节>][netmask<子网掩码>][tunnel<地址>][-broadcast<地址>][-pointopoint<地址>][IP地址]
补充说明:ifconfig可设置网络设备的状态,或是显示目前的设置。
参 数:
add<地址> 设置网络设备IPv6的IP地址。
del<地址> 删除网络设备IPv6的IP地址。
down 关闭指定的网络设备。
<网络设备类型><硬件地址> 设置网络设备的类型与硬件地址。
io_addr 设置网络设备的I/O地址。
irq 设置网络设备的IRQ。
media<网络媒介类型> 设置网络设备的媒介类型。
mem_start<内存地址> 设置网络设备在主内存所占用的起始地址。
metric<数目> 指定在计算数据包的转送次数时,所要加上的数目。
mtu<字节> 设置网络设备的MTU。
netmask<子网掩码> 设置网络设备的子网掩码。
tunnel<地址> 建立IPv4与IPv6之间的隧道通信地址。
up 启动指定的网络设备。
-broadcast<地址> 将要送往指定地址的数据包当成广播数据包来处理。
-pointopoint<地址> 与指定地址的网络设备建立直接连线,此模式具有保密功能。
-promisc 关闭或启动指定网络设备的promiscuous模式。
[IP地址] 指定网络设备的IP地址。
[网络设备] 指定网络设备的名称。
Cmp(compressed):有些以太网层是压缩后传输的
Mcst(muticase):广播
Sar命令信息少了点,不过格式化得很好:
sar [-n DEV | EDEV | SOCK | FULL ] [DEVICE] [interval] [count]
Sar -n DEV 1 2
更多关注每秒的包的个数,包量
Totsck:在用中的socket的个数
Tcpsck:tcp socket的个数
Udpsck:udp socket的个数
Rawsck:raw socket的个数
Ip-frag:ip包的数目
netstat [-p] [-c] [–interfaces=<name>] [-s] [-t] [-u] [-w]
Option
Explanation
-p
Displays the PID/program name responsible for opening each of the displayed sockets
-c
Continually updates the display of information every second
--interfaces=<name>
Displays network statistics for the given interface
--statistics|-s
IP/UDP/ICMP/TCP statistics
--tcp|-t
Shows only information about TCP sockets
--udp|-u
Shows only information about UDP sockets.
--raw|-w
Shows only information about RAW sockets (IP and ICMP)
Netstat的常用参数 -n,避免进行域名解析;-c每秒更新一次;-s查看统计信息;-l查看监听的情况
网络性能问题跟进:
如果发现是网络I/O存在瓶颈,首先需要查看一下是否已经达到网卡上限,通过ethtool查看一下当前的网卡设置是否合理,如本来100/10M自适应的网卡将其设置成为10M的话,就会出现瓶颈了。
如果设置是没有问题的,通过ifconfig、sar这样的命令可以查看当前的网卡使用情况;再通过netstat -p来找到具体的进程,也可以找到是因为udp还是tcp导致的瓶颈。
找到进程后,可以通过strace的方法来跟进进程的情况。或者通过tcpdump来查看是什么客户端往这个端口发包的情况。这里只能根据实际的情况来解决问题了。
网络调优参考:
http://datatag.web.cern.ch/datatag/howto/tcp.html
以前对网卡的一些参数不是很了解,最近才知道已经有了10G的网卡,多队列,以及其它一些技术如MSI-X等。想想网卡如果10G的话,cpu的计算性能的要求也要很高才是。如过按照mtu 1500个字节来计算的话,10G 一秒钟就需要处理 10G / 8 / 1500 ~ 83W,很大的一个量了。
加入现在服务器的cpu也是多核的,操作系统如何让cpu能够均衡的来服务网卡,也是需要考虑的。
从intel的官方站点了解到一些网卡的配置参数:
http://www.intel.com/network/connectivity/resources/technologies/optimized_multicore.htm
Intel's next-generation Ethernet controllers distribute the workload to available processor cores using MSI-X and VMDQ, receive-side scaling, and Scalable I/O, which use multiple queues to process multiple requests simultaneously. These improvements result in lower CPU utilization, lower latency, and better application ...
export,set,env都可以用来设置环境变量,多少又有一些不同的地方:
export [-fn] [-p] [name[=value]]
这个是对所有进程有效的,所以一般也是会在系统启动后就执行。写在/etc/profile里面
set [--abBCefhHkmnpPtuvx] [-o option] [argument ...]
这个是进程或者是shell当前有效的,进程或者shell退出后变量就不起作用了。
env [OPTION]... [NAME=VALUE]... [COMMAND [ARGS]...]
env同set,不过一般主要用来显示环境变量,如env | grep "***"
对于bash shell
关于环境变量命令介绍:
1.echo 显示某个环境变量值 echo $PATH
2.export 设置一个新的环境变量 export HELLO="hello" (可以无引号)
3.env 显示所有环境变量
4.set 显示本地定义的shell变量
5.unset 清除环境变量 unset HELLO
6.readonly 设置只读环境变量 readonly HELLO
用C程序来访问和设置环境变量
对于C程序的用户来说,可以使用下列三个函数来设置或访问一个环境变量。
◆ getenv()访问一个环境变量。输入参数是需要访问的变量名字,返回值是一个字符串。如果所访问的环境变量不存在,则会返回NULL。
◆ setenv()在程序里面设置某个环境变量的函数。
◆ unsetenv()清除某个特定的环境变量的函数。
参考:http://webtools.live2support.com/linux/
http://ss64.com/bash/set.html
什么是环境变量
环境变量是一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。许多用户(特别是那些刚接触Linux的新手)发现这些变量有些怪异或者难以控制。其实,这是个误会:通过使用环境变量,你可以很容易的修改一个牵涉到一个或多个应用程序的配置信息。
一般不太熟悉的两个环境变量:
PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,My NewPrompt ”。
# PS1=" Hello,Welcome "
Hello,Welcome
下表罗列了一些Linux系统使用的变量并说明了它们的用处。在表格后面将列举一些变量例值。
变量
说明
PATH
这个变量包含了一系列由冒号分隔开的目录,系统就从这些目录里寻找可执行文件。如果你输入的可执行文件(例如ls、rc-update或者emerge)不在这些目录中,系统就无法执行它(除非你输入这个命令的完整路径,如/bin/ls,所以在shell脚本里会显示来指定这个变量,从而避免一些命令找不到的情况)。
ROOTPATH
这个变量的功能和PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。
LDPATH
这个变量包含了一系列用冒号隔开的目录,动态链接器将在这些目录里查找库文件。
MANPATH
这个变量包含了一系列用冒号隔开的目录,命令man会在这些目录里搜索man页面。
INFODIR
这个变量包含了一系列用冒号隔开的目录,命令info将在这些目录里搜索info页面。
PAGER
这个变量包含了浏览文件内容的程序的路径(例如less或者more)。
EDITOR
这个变量包含了修改文件内容的程序(文件编辑器)的路径(比如nano或者vi)。
KDEDIRS
这个变量包含了一系列用冒号隔开的目录,里面放的是KDE相关的资料。
CONFIG_PROTECT
这个变量包含了一系列用空格隔开的目录,它们在更新的时候会被Portage保护起来。
CONFIG_PROTECT_MASK
这个变量包含了一系列用空格隔开的目录,它们在更新的时候不会被Portage保护起来。