![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
经验积累
文章平均质量分 70
lotluck
我会成为你的眼睛,为你看清未来
展开
-
记录一次采坑--如何处理Linux动态库同名函数?
一、背景介绍需求描述:业务提供一个鉴权的静态库,我只需要从url 和 参数中提取相应的参数传给业务的静态库,将静态库的处理结果直接返回给业务(return < 0, 直接返回403)。但是最近业务反馈,请求部分url直接返回Error:-1015错误,不符合预期。二、分析过程业务刚开始反馈问题,我的第一反应:怎么可能是我的问题,我就仅仅写了一个so(暂时命名1.so),直接调用了你...原创 2019-07-26 20:40:55 · 1968 阅读 · 0 评论 -
Transfer-Encoding 和Content-Encoding
Transfer-Encoding: chunked分块编码,对应Content-Length计算实体长度。 有的时候服务器发送的数据并没有具体的长度,这是时候就需要chunked分块编码 Content-Encoding:gzip 内容编码, 很多网站都使用了gzip压缩,这样使传输的数据量减少了3/4,但是一般图片不建议压缩,因为图片都是压缩过的Content-Encoding 和 Trans原创 2017-12-26 21:28:20 · 2167 阅读 · 0 评论 -
软件开发流程
一、需求 1.1 需求的定义 简单而言需求就是完成相应的功能 1.2 需求的评估 一般而言,当被提出有需求的时候,应该认真评估分析一下需求到底能不能做,很多需求都含有暗坑,评估不好,后面的事情就非常麻烦。为了不让自己麻烦,对于评估后认为不合理的需求,应该及时的砍掉。对于合理的需原创 2017-12-18 13:03:08 · 306 阅读 · 0 评论 -
长期更新琐碎易忘知识点。。。。。
这篇文章主要是记录一些常用的小技巧, 日积月累, 用的时候直接粘贴复制即可。 . 在C语言中对于小函数的宏定义是非常好的,因为好用,也可以屏蔽类型#include #define Swap(a,b) {a = a ^ b; \ b = a ^ b; \a = a ^ b; \} #define averge(a,b) ((a&b)+((a^b)>>1)i nt main() { int a = 4,b = 3; Swap(a,b); 在写简单的动态数组的时候,开辟的内存需要是32的整数倍原创 2016-09-13 16:17:52 · 581 阅读 · 0 评论 -
字符数组md5[4]转换成uint32_t的无符号整数转化?
一个unsigned char md5[4]数组转成uint32_t的无符号整数转化其实也很简单,只要清楚内存的分布结构就没有问题linux内存是由高地址到低地址的,对于md5[4]和int a的分布就是这样子的,md5数组占用4个字节,int也占用4个字节,char数组转成int数组的时候,就是从char数组的末尾开始的,一张图看懂看不懂就看造化了#include <stdint.h>int ma原创 2017-12-25 16:50:41 · 3130 阅读 · 0 评论 -
内嵌汇编 - cmpxchgl 指令学习笔记
一、背景又是关于汇编,头真是大,当年欠吴旭老师的汇编终究还是要还的。 在看nws源码的时候,里面有这样一段代码static __inline__ unsigned long atomic_cmp_set(volatile void *ptr, unsigned long old, unsigned long set){ unsigned l原创 2017-12-13 16:35:14 · 4879 阅读 · 0 评论 -
GCC在C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。1、简单的内嵌汇编例:__asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"asm"是"__asm__"的别名。"__volatile__"表示编译器不要优化代码,后面的指令 保留原样,"volatile"是它的别名。括号转载 2017-10-24 09:46:19 · 586 阅读 · 0 评论 -
HTTP中的Range: bytes=0-
HTTP中的Range就是分段请求字节数,也是大家经常说的断点续传。Range头域可以请求实体的一个或者多个子范围,Range的值为0表示第一个字节,也就是Range计算字节数是从0开始的表示第二个500字节:bytes=500-999表示最后500个字节:bytes=-500表示500字节以后的范围:bytes=500-第一个和最后一个字节:bytes=0-0,-1同时指定几个范围:byt原创 2017-11-09 10:13:07 · 10581 阅读 · 0 评论 -
[CDN 技术] HTTP参数中Etag的重要性
Etag在HTTP1.1中有介绍,主要的作用就是在(css file, image, javascript file)文件后面添加一个唯一的参数(相当于查询参数字符串),Etag有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求获取 Etag发生变化的文件,减少浏览器端数据的流量,加快浏览器的反应速度,重要的是减轻服务器端的压力,所以服务器端Etag的实现就比较重要了.现在我们有个问题为什么要使用Etag呢?Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_转载 2017-11-04 20:18:21 · 2424 阅读 · 0 评论 -
共享内存映射之mmap()函数详解
共享内存映射之mmap()函数详解 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中转载 2015-09-01 21:59:10 · 519 阅读 · 0 评论 -
提升自旋锁spinlock的性能-pause指令
看源码的时候get的一个新的知识点,可以提升自旋锁spinlock的性能-pause指令,看到的源码如下: #define cpu_pause() __asm__ (".byte 0xf3, 0x90") #define NOP_CPU3(n) {int i = 0; while(i++ < (n)) cpu_pause();} // 调用代码原创 2017-10-24 14:22:43 · 3574 阅读 · 0 评论 -
采坑 uint32_t 和 uint64_t
uint32_t 和 uint64_t 混用,超出uint32_t的范围,结果导致计算错误。。。#define INNER_TANK_NODE_INFO_LEN 8192sata_node_info_num_ = chunk_num_ + big_chunk_num_;chunk_base_addr_size_ = sata_node_info_num_ * INNER_TANK_NODE原创 2018-01-22 17:08:51 · 2857 阅读 · 0 评论 -
linux pmap
pmap查看某个进程的内存使用情况最核心就是最后一句: mapped:23344Kwriteable/private:1280Kshared:4K\color{red}{mapped: 23344K writeable/private: 1280K shared: 4K}mapped表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz\col原创 2018-01-17 11:29:24 · 441 阅读 · 0 评论 -
高CPU问题----eth0: NIC Link is Down网卡故障导致高CPU
一、 现象: cpu异常飙升(这台机器的eth0网卡在2018年12月的时候就出现问题)二、分析发现:1. dmesg [Thu Mar 14 01:02:00 2019] ixgbe 0000:02:00.0 eth0: NIC Link is Down [Thu Mar 14 01:02:04 2019] ixgbe 0000:02:00.0 eth0: NIC Lin...原创 2019-03-23 16:04:57 · 16006 阅读 · 1 评论 -
Linux创造固定的文件大小-预分配磁盘空间
一、课前预习写本篇文章的目的很简单,防止采坑、防止采坑、防止采坑我们在开发程序的过程中,往往需要预分配磁盘空间,防止因磁盘空间不够而引发程序异常问题(已踩过坑), 现网查阅资料,有些预分配磁盘空间的方法不正确,在这里特别记录一下, 除此之外,把正确的预分配的方法和大家分享一下,如果其他人有建议,欢迎拍砖狠砸二、假:磁盘预分配—ftruncate1. 使用lseek、ftruncate到一个...原创 2018-10-25 16:05:04 · 4966 阅读 · 2 评论 -
mmap其实并没有那么好
现网问题关于mmap的基本操作自行google去吧, 一抓一大把,99%基本上夸mmap是有多好多快,mmap快是因为建立了页到用户进程的虚拟空间映射,以读取文件为例,避免了页从内核态拷贝到用户态, 少了一次拷贝,而且在内存中操作,从这个层面看,mmap是屌屌的。但是在现网使用, mmap带来很多问题。 图一: 内存吃紧,swap也是关闭, 该进程使用内存状况 图二: 该进程 mm...原创 2018-08-13 16:18:39 · 18418 阅读 · 2 评论 -
我把Linux系统上面误删的数据找回来了
我把Linux系统上面误删的数据找回来了 一、背景突发事件,应用上传的数据被程序自动删掉了,可悲的是还没有数据备份,数据是放在系统的 /data/webapps/xxxx/upload 目录下面,可把我们急坏了,之前又没有做过数据恢复的测试,然后我找到了一款数据恢复的软件,成功把删除的大部分数据找回来了,我的数据恢复过程如下。二、安装恢复软件1、epel 仓库安装...转载 2018-04-12 14:58:36 · 1114 阅读 · 0 评论 -
Latency numbers every programmer should know
Latency numbers every programmer should knowLatency numbers every programmer should knowL1 cache reference ......................... 0.5 nsBranch mispredict ............................ 5 nsL2 c...翻译 2018-04-12 11:01:14 · 621 阅读 · 0 评论 -
tcpdump只抓取HTTP报文头部
因为要做一个需求,我需要调研现网请求http头部的大小,都有什么字段,shell脚本代码如下所示#! /bin/bashs_512=0s_512_1k=0s_1k_2k=0s_2k_4k=0s_4k_8k=0s_8k=0idx=0while truedo if (($idx >= 10000));then break fi ...原创 2018-04-02 23:39:21 · 9531 阅读 · 0 评论 -
简单计算磁盘平均IO
如果有多个磁盘, 计算的时候就需要计算平均值,显然直接利用linux的iostat的命令不能完成这个需求,下面是个简单的计算磁盘相关平均指标的脚本#! /bin/bash#iostat -x 1 2 > 1.txt#sed -i '1,22'd 1.txt# $1 is file namefile_name=$1grep -E "(sd)[b-m]" $file_...原创 2018-04-02 14:33:10 · 1630 阅读 · 0 评论 -
tcpdump提取源IP
需求: 使用tcpcopy复制现网到测试机器,但是测试机器并不知道导入流量的OC机器IP是多少 查询tcpdump的参数,然而并没有参数可以直接提取源IP。于是采用了比较土的办法,按部就班的提取tcpdump抓包过滤出源IPtcpdump -i eth0 port 36524 -nn -c 5000 2>/dev/null | awk '{print $3}' | awk -F '....原创 2018-04-08 15:12:37 · 7987 阅读 · 0 评论 -
FLV格式解析及其解析器的实现
一、FLV基础入门最近在搞flv解析器,网站看到一些比较好的基础入门资料,直接搬过来了 FLV文件格式详解 FLV文件格式解析 FLV封装原理 flv文件元信息(metadata) FLV文件结构解析其实看这么多资料还不如下载一个flv解析器(flvparse)直接看里面的格式,heard、tag应有尽有,一目了然 二、FLV解析器实现在对flv格式清楚的基础上,就...原创 2018-02-26 10:57:56 · 2491 阅读 · 2 评论 -
清理cache sync && drop_caches
问题描述在linux上用iostat观察磁盘的时候,发现sda周期性的出现毛刺最后调查原因发现是因为cache的原因,linux会集中写入sda,导致毛刺\color{red}{因为cache的原因,linux 会集中写入sda,导致毛刺}解决办法周期性的执行下面两个命令,让日志不集中写入sda就可以,时间自己把握[root@ying ]# sync[root@ying原创 2018-01-17 16:54:37 · 1424 阅读 · 0 评论 -
利用伪B站做测试的时候遇到304的一点小问题
用户先请求nws服务器,如果本地可以命中,nws直接返回文件给用户; 如果本地没有命中,nws回源向伪B站请求文件,就是简单的cdn的思路。Created with Raphaël 2.1.0用户nws服务器 伪B站作为一个做cdn的,用户永远之上。 用户要求怎么做,我们就怎么来。 基于这样的想法,我在测试nws是否可以正确的吐出伪B站给数据, 就算伪B站给nws的数据是错误的,不符合常规,nws也原创 2017-09-28 11:32:27 · 615 阅读 · 0 评论 -
新增加的HTTP状态码 -- 103
IETF公布了新的HTTP状态码-103, 总结一下就是提前预加载(css、js)文档,提升用户的访问速度。Summary: a new status code that lets the server send headers early, before the main headers. This helps with optimisations like preloading. Example原创 2017-11-08 16:21:10 · 4406 阅读 · 0 评论 -
使用iostat分析IO性能
对于I/O-bond类型的进程,我们经常用iostat工具查看进程IO请求下发的数量、系统处理IO请求的耗时,进而分析进程与操作系统的交互过程中IO方面是否存在瓶颈。下面通过iostat命令使用实例,说明使用iostat查看IO请求下发情况、系统IO处理能力的方法,以及命令执行结果中各字段的含义。1.不加选项执行iostat我们先来看直接执行iostat的输出结果:转载 2015-06-02 22:20:48 · 2596 阅读 · 0 评论 -
Python实现伪源站服务器
学习python是因为当时学习的C语言实现一个东西太难了,做一个图形界面又丑又难看,而且还很难写。python高度封装,简洁,第三方库也超多,像列表这种东西用起来真是太爽了,对于字符串简直无所不能,所以还是那句话人生苦短,我用python。当时对语言的性能并没有太多的认知,写代码大多也就一两百行的样子,内存、CPU都是可以随意挥霍的东西。python的性能还是比不上C语言,但是开发速度还是很可以的,大家都说一种很折中的go语言,开发速度与执行效率介于python和C语言之间,以后有时间在学校吧。通过看源码w原创 2015-05-09 09:57:08 · 2125 阅读 · 0 评论 -
tinyhttpd源码
之前接触了webbench源码,感觉还阔以美滋滋,有时间了意外又看到了tinyhttpd源码,不错,好的我还是引用人家的话。tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。下载链接:http://sourceforge.net/projects/tinyhttpd/ 代码整体思路还是很清晰,也就12个函数,没有什么比较难的地方。我学习这个主要还是加深对C语言原创 2015-02-19 13:19:19 · 1337 阅读 · 0 评论 -
关于setsockopt的SO_SNDLOWAT低潮发送
先从sendfile说起吧,sendfile其实就是大家口中说的“零拷贝”,在服务器传输大文件方面具有卓越的性能,究其无非主要原因两点: 1. 减少CPU的使用 2. 减少系统调用和数据拷贝的次数。这方面的资料很多,大家网上可以自行搜索。在测试sendfile的小IO问题的时候,意外需要设置setsockopt的SO_SNDLOWAT字段,SO_SNDLOWAT是一个发送低潮字段,根据网上的解释,设置该字段可以当缓冲区有多少剩余空间的时候才被触发调用。那样岂不是很爽,那调用sendfile的原创 2015-04-01 21:00:46 · 2959 阅读 · 0 评论 -
webbench学习源码
深入学习一个语言或者想提升自己的编程水平,最好的办法就是学习优秀的源代码,一个意外的机会,接触到了webbench的源码,里面认认真真的看下去真是get到不少东西。webbench就是一个用纯C语言实现压测工具,思路很简单,主进程创建出多个子进程,让多个子进程去访问url,记录子进程访问该网页的情况,主进程和子进程之间采用管道通信,最后主进程汇总子进程的数据结果,就是这么简单。 在webbench源码中,有很多技巧值得学习,如何组织代码让代码精剪一目了然,如何巧妙的使用全局变量,而且大量的字符串处理函数st原创 2015-01-26 16:14:31 · 931 阅读 · 0 评论 -
进程间通信(IPC) 之 共享内存 和 闲扯其他一些东西
其实,写这篇文章是带着多么激动的心情,终于没有bug这一篇有好几处我还要在加强练习。在进程间通信(IPC),函数好多,好多都没有记住,查man的时候就特别烦,一大段一大段的英语,看的一个头有8个大,先来谝谝共享内存。 先说说我理解,对于共享内存,我感觉这效率还是很高的,因为内核基本上说不干预,说的最好(IPC之中)原创 2016-01-19 00:47:07 · 948 阅读 · 2 评论 -
利用排序那点事来说说函数指针好在哪里?
看了一下有些人写的关于函数指针的文章,对于初学者学习起来有点费力,原因很简单——没有具体的代码演示,理解的自然而然不那么深刻强烈,总感觉有点空洞。我今天用大家很清楚的排序代码来说说函数指针好在哪里?先提一下函数指针与指针函数以免搞混淆,其实很好区分,就按照字面意思来理解, 函数指针:一个指向函数的指针,本质是指针。原创 2015-09-02 12:44:38 · 447 阅读 · 0 评论 -
linux解析命令行参数getopt_long
在一些小程序的函数中,程序猿可以很好的维护和管理程序(修bug,增加函数),但是在一些大程序里面往往有许许多多的函数,如果仅仅靠程序猿维护的话根本就忙不过来,费时费力,也不现实,在面向对象中,面向对象语言的基本单位是类(Class),她封装了数据成员(属性)和成员函数(方法),将最小组件的提高了一个等级,程序员需要直接操作的不是过程和函数,而是更高层次上的类。虽然提供了很多的方法和属性,但是每种不原创 2014-10-13 01:57:36 · 937 阅读 · 0 评论 -
利用aio+epoll简单改写sendfile
其实说白了,也就是想直接尝试利用一下aio +epoll结合代码,在利用人家sendfile的接口,就是替换sendfile,自己随便玩玩传输文件。我采用的是linux原生的libaio,glibc实现的aio貌似很多在吐槽,性能也不好直接别抛弃了。 这里提一下linux libaio的相关结构体,这些可以在/usr/include/libaio.h文件看到,也有io_prep_pread和原创 2017-08-17 15:55:26 · 1369 阅读 · 0 评论 -
ngx_buf_t数据结构
导语:通过网上阅读查阅,尽量把nginx源码这一部分整理完善,让以后想要学习nginx的同学也可以快速上手。这一节涉及src/core/ngx_buf.h|c的数据结构,其次,看一些大牛文章时候 get 了一个好的画图工具- graphviz 和一个拍照app-扫描全能王,可以帮助理清源码的思路。一、结构体、相关宏定义、函数声明梳理 分析采用nginx-1.6.2源码。在src/core/ngx_buf.h|c中的ngx_buf_t 结构体还是很重要,看源码的过程中遇到几次,确实有必要好好理理。ngx_原创 2014-10-23 21:39:34 · 1991 阅读 · 2 评论 -
linux C 获取cpu数目
我们现在写的代码一定要考虑可移植性,就举一个很简单的例子,一个进程开启的线程数量与CPU个数相关,而不同的机器CPU的数目不同,当我们代码从一个机器移到另外一个机器的时候,我们就不要手工修改先关参数,直接写代码自动获取CPU数目从而自动生成合适的线程数目。原创 2015-02-19 13:17:38 · 2176 阅读 · 0 评论 -
浅析SkipList跳跃表原理及代码实现
SkipList在leveldb以及lucence中都广为使用,是比较高效的数据结构。由于它的代码以及原理实现的简单性,更为人们所接受。我们首先看看SkipList的定义,为什么叫跳跃表?“ Skip lists are data structures that use probabilistic balancing rather than strictly enforced balancing. As a result, the algorithms for insertion转载 2015-07-12 12:35:23 · 724 阅读 · 0 评论 -
关于读写锁pthread_rwlock_t
当我们使用pthread_rwlock_rdlock()获取一次读锁时,__nr_readers字段就会加一,注意,就算是同一个线程,在已经获得读锁的情况下,再去获取读锁,__nr_readers字段仍然会加一的,当我们调用pthread_rwlock_unlock()一次时,__nr_readers就会减一,如果我们重复加了读锁,必须重复调用pthread_rwlock_unlock()来使__nr_readers减一,否则其他线程再想获取写锁时,是会阻塞的。 2.__writer记原创 2015-06-30 23:53:28 · 1553 阅读 · 0 评论 -
两种常用的编程模型
并发系统可以采用多种并发编程模型来实现。并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业。不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同。这篇并发模型教程将会较深入地介绍目前(2015年,本文撰写时间)比较流行的几种并发模型。并发模型与分布式系统之间的相似性本文所描述的并发模型类似于分布式系统中使用的很多体系结构。在并发系统中线程之间可以相互通信。在分布式系统中进程之间也可以相互通信(进程有可能在不同的机器中)。线程和进程之间具有很多相似的特性。这也就是为什么很多并发模转载 2017-11-08 22:33:02 · 4494 阅读 · 0 评论 -
将进程绑定到特定的cpu - taskset命令
在测试斗地主程序的时候,发现单核cpu的运行时间总比多核cpu运行时间块,用taskset命令一看,果然是一个进程运行在两个cpu上。 Score of team 1 is : -1154 Score of team 2 is : 148 Score of team 3 is : 1006 real 4m12.768s user 0m12.307s sy...原创 2017-10-12 09:57:03 · 2490 阅读 · 0 评论