- 博客(75)
- 资源 (6)
- 收藏
- 关注
原创 socket中MSG_WAITALL和SO_RCVTIMEO(SO_SNDTIMEO)选项
这几个选项都可以通过setsockopt函数来对套接字进行设置,MSG_WAITALL要求套接字在接收时,阻塞地等到指定的长度的消息都到达才返回,可以简化TCP连接中分片的情况下,需要多次接收的处理。SO_RCVTIMEO(SO_SNDTIMEO)可以设置套接字的接收(发送)超时,防止套接字一直等待造成的程序阻塞。需要注意的是,及时设置了MSG_WAITALL,套接字还是可能会因为超时而提...
2018-09-18 12:22:24
2217
原创 RabbitMQ使用简谈
最近简单看了一下RabbitMQ,这里简单总结一下。(先写到现在学习的,有错误的话后面再改正)相较于其他MQ,RMQ更加成熟稳定,所以有更大的学习的价值。相较于ZMQ只是一个网络组件,RMQ是一个独立的服务,使用时需要服务器和RMQ server之间进行通信。RMQ服务器保证了消息的持久化和消息的正确发送。相较于ZMQ简单的直接根据连接类型(订阅、消费)等直接生成socke...
2018-06-24 17:52:42
261
原创 中文编码及绘制
最近一个任务是判断一个字符串是不是中文,并将其绘制到一个jpg文件上。对于编码一直挺糊涂的,这次梳理了一下。对于一个文件,可以使用file -i a.txt查看它的编码格式(不知怎么回事,我的终端是utf-8,在vim中输入中文时,老是出现乱码,只能在notepad++中编辑好之后再上传到linux上,可能是vim的设置有问题。)当终端和文件的编码方式一致时,就能显示正常的中文。回...
2018-06-02 18:30:06
316
原创 消息队列简谈
现在软件开发越来越复杂,各部分耦合也越来越严重。尤其是一些创业公司,各部分模块变化频繁,给软件开发和设计提出了很多的要求。这时候,消息队列就越来越重要了。一般来说,消息队列的使用场景有:1、各部分解耦合2、高峰时的削峰(作为cache)3、可以作为RPC调用4、热插拔,可以在不重启的情况下,改变网络拓扑形式和计算能力,对系统进行扩容我主要看了Zero...
2018-05-20 16:09:47
211
原创 无锁并发编程简谈
(有半年没有写博客了,时间飞逝呀。。。。 :o )这里简单介绍一下无锁并发编程。现在CPU的核越来越多,多线程、并发编程已经成为趋势。一涉及并发,同步是绕不开的话题。一般的方法是使用Mutex、旋转锁、条件变量等系统提供的方法来进行同步。(一个问题,Mutex和自旋锁的区别?)如果并发不太大,qps是数百时,这些方法还没有问题,但是当qps增加到数千时,这些同步方法的开销就太大...
2018-05-10 11:56:04
771
原创 query求交模块总结
最近重新梳理了一下query的求交模块,记录一下。以前不太清楚的地方,主要是怎么处理近义词(比如“蔡依林”和“Jolin”)以及怎么有些没全部命中term也可以找到。第一个,在数据制作的过程中就会处理近义词,做到相应的倒排中(会标明近义词)。而且,求交的过程中,近义词也会一起参与求交。“蔡依林演唱会”其实是“蔡依林”“Jolin”“演唱会”三个词一起求交。这样就不会遗漏一些很相似的...
2017-11-05 15:01:39
134
原创 TCP三次握手和keep_alive
tcp/ip协议很久之前看过,现在忘得差不多了,补充一下tcp的三次握手和状态。[img]http://dl2.iteye.com/upload/attachment/0127/6929/d85f79ac-2e6a-3f13-ae9d-5f21b18d8109.png[/img]当对已经关闭的tcp套接字调用recv时,会返回-1,表示连接已经关闭,这是因为tcp有一个keep_a...
2017-11-05 14:17:59
300
原创 qs收集结果
前一段处理qs网络堵塞的问题,进一步将lq和qs之间的通信做了一些梳理,记录一下。我们知道,lq是一遍查找,一遍向qs发送请求的,每遍历一定数量的doc后(比如说60w,具体和工作场景有关),就向qs发送一定数量的结果。qs将这些答复汇总后记录,当达到一定的条件之后,就发送cancel信号,lq停止查找。以前以为lq发送一定的结果之后,就停止查找,qs也是偶尔才会发送cancel信...
2017-09-29 16:05:35
161
原创 perf查看函数调用
前一段使用perf查看程序的热点以及函数调用,一直看不到热点函数的函数调用,很是奇怪,在网上问别人,别人都说没问题,一度很是迷惑。后来又试了一下,结果就出现了,很是神奇。使用方法很简单,就是perf record加上-g选项。另外,perf top也可以查看程序的热点,选项是-G。上图一张,就是以前很渴望的调用函数。[img]http://dl2.iteye.com/u...
2017-09-02 10:51:10
7336
原创 query的网络模型
最近看了一下项目的代码,写一下query的网络模型。cache和query之间通信比较简单,就是tcp通信。qs和lq之间通过udp通信,而且扩展性比较好,这里记录一下。刚开始lq绑定一个端口(udp也可以绑定),然后qs通过配置文件,读取每个lq的地址,然后和没有lq建立一个连接。qs向lq发送请求时,请求中会包含一个字段,为qs等待接收答复的地址,这样,同一组里所有的lq都会向...
2017-07-15 17:25:27
230
原创 倒排和正排
搜索主要用到了三个文件:diskdata、docinfo和forwardindex。diskdata文件是倒排文件,用于求交。docinfo是doc的一般属性信息(pagerank/publish_time/颜色签名/尺寸等),用于排序前的剪枝(就是根据request信息简单过滤)。forwardindex是正排信息,用于求更重rank。排序时要整合docinfo和...
2017-06-26 10:36:50
582
原创 socket编程近期经验总结
最近在做的一个小项目,难度不大,但是网络传输部分费了一点周折,在这里把近期的一些经验教训总结一下。因为是自己的一点心得,如果有疏漏,后面再补充修正。程序使用TCP协议传输,先epoll_wait(其实连接不多,只是熟悉一下,结果确实学到了东西),然后进行接收。因为TCP有流量控制,会把大的流进行分片,所以一次recv并不能接收全部的数据,刚开始就先接收一个header,包含了流的长度,然后...
2017-06-18 16:38:44
137
原创 一次socket排错
用socket通信,一般复用以前的组件,很少直接从底层写,很多问题没有注意到。这次写人脸打卡,server和qo之间的通信,我用以前的Transporter,底层是TCP通信。每当qo重启或者通信错误时,server便重连一次。程序刚开始运行很正常,但是有一次发现通信错误,qo发给server的内容是错误的,于是排查。刚开始以为是qo错误,但是看了一下qo的日志,发现没有问题。于是用ss ...
2017-05-31 19:24:17
149
原创 一次linux系统网络调优
两台服务器之间利用udp协议传输数据,增大传输量后从日志发现有很多丢包现象,使用nload发现平均速率只有200Mbp/s,并没有达到理论极限。是网卡有故障吗?仔细思考后找到了原因,nload统计的是平均速率,但是网络传输是很快的,并不是一个稳定的速率,可能某一瞬时速率超过了前兆网卡的极限,就发上了丢包现象。所以平均速率并不能很好地说明问题,尽管平均速率很低,网络还是形成了瓶颈。后...
2016-09-11 18:24:23
163
原创 Linux系统内存使用
使用linux操作系统很多年了,但是对于内存使用不是太了解(估计很多人都不太懂),正好最近有个任务要降低程序的内存使用(要在一个服务器上同时跑更多的程序,内存成为瓶颈),就稍微深入了解了一下linux内存的使用说明。一般来说看内存使用一般使用top命令,top命令的输出大致如下: PID USER PR NI [color=red]VIRT RES SHR ...
2016-09-11 17:29:03
135
原创 线程池的使用
以前没自己写过线程池,觉得挺神秘,前一段看了一下项目中线程池的实现,也挺简单。所以说会者不难,难者不会。其实就是定义一些结构体,大致长这样:struct Item{ Func *f; Arg *arg;};然后维持一个链表,线程每次从连表中取一个Item,然后运行函数(调用f(arg)),结束后再通知调用函数。既然是多线程,当然会涉及到锁和...
2016-01-02 20:17:42
103
原创 使用LFM(Latent factor model)隐语义模型进行Top-N推荐[转]
原文地址:[url]http://blog.csdn.net/harryhuang1990/article/details/9924377[/url]最近在拜读项亮博士的《推荐系统实践》,系统的学习一下推荐系统的相关知识。今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结。隐语义模型LFM和LSI,LDA,Topic Model其实都属于隐含语义分析技术,是一类概念,他...
2016-01-02 19:45:12
135
原创 c++动态链接库错误导致的程序运行异常
昨天改程序,明明代码都编译通过了,但是运行程序时老是出错,一会儿说文件加载异常,一会儿说找不到符号(“symbol lookup error”),在程序中加注释也没有打印,一度怀疑是见鬼了。 后来搜了一下,一般报的找不到符号错误是因为链接错误造成了,就使用ldd命令查看程序链接了什么动态链接库。结果发现编译时链接的是本地的动态链接库,然后我使用“make install DE...
2015-12-01 17:21:12
1019
原创 一个比较巧妙的主备机设置
[img]http://dl2.iteye.com/upload/attachment/0111/6453/ac3e95b2-597b-3601-84b2-f553b4f0eb79.png[/img]manual01 manual02互为主备,平时请求均匀打到两台机器上,一台出故障之后全部请求打到健康的一台上。...
2015-09-11 17:47:02
368
原创 C/C++ 中的0长数组(柔性数组)
在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:StructPacket{Int state;Int len;Char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持,也可以将“0”省去};首先对0长数组做一个...
2015-03-18 18:16:50
186
原创 排序算法
有时间可以学习一下:learning to rank[url]http://www.360doc.com/content/14/0218/16/13256259_353571486.shtml[/url][url]http://www.cnblogs.com/kemaswill/archive/2013/06/01/3109497.html[/url]bm25...
2015-02-15 16:48:53
105
原创 动态链接库地址重定位【转】
前面写过动态链接库 延迟绑定的一篇博文,那篇文章我非常喜欢,但是当时刚搞清楚,自己写的比较凌乱,我最近学习了Ulrich Drepper的How to write share library,学习了几篇其他的讲述动态链接的文章,再次整理了这篇文章。 有一个问题是我们调用了动态链接库里面的函数,我们怎么知道动态链接库里面的函数的地址呢?事实上,直到我们第一次调用这个函数,我们并不知道...
2015-02-06 12:27:34
804
原创 查看服务器处理器、内存的信息
cat /proc/cpuinfocat /proc/meminfodmidecode -t processordmidecode -t memory #可以查看内存频率,制造商等信息
2015-01-28 15:43:33
201
原创 查看程序运行热点(perf)
主要介绍一个定位程序热点的工具:perf。 性能调优工具如 perf,Oprofile 等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文。假如一个程序 90% 的时间都花费在函数 foo() 上,那么 90% 的采样点都应该落在函数 foo() 的上下文中。运气不可捉摸,但我想只要采样频率足...
2015-01-16 17:19:42
4315
原创 【转】召回率 Recall、精确度Precision、准确率Accuracy、虚警、漏警等分类判定指标...
根据自己的知识总结的,定义应该肯定对了,在某些表述方面可能有错误的地方。假设原始样本中有两类,其中: 1:总共有 P个类别为1的样本,假设类别1为正例。 2:总共有N个类别为0 的样本,假设类别0为负例。 经过分类后:3:有 TP个类别为1 的样本被系统正确判定为类别1,FN 个类别为1 的样本被系统误判定为类别 0,显然有P=TP+FN; 4:有 FP 个类别为0 的样本...
2014-12-04 19:37:10
542
原创 Linux读写锁使用
读写锁很早就知道了,但是使用的不多,这次代码中出现了,才认真思考怎么用。摘录一下:读写锁的特点是:当读写锁是写加锁时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。当读写锁是读加锁时,在这个锁被解锁之前,所有试图以读模式对他进行加锁的线程都可以得到访问权,但是如果线程以写模式对此锁加锁时会造成阻塞,直到所有线程释放读锁这里有一个问题,如果一个线程现 A 获得一把...
2014-10-17 14:48:14
123
原创 内核线程和用户态线程
读书看到下面这一段,不太理解,就搜了一下,学了很多东西。[img]http://dl2.iteye.com/upload/attachment/0101/1229/77b038f5-c8a0-3683-a4c6-b9c1ac9b2f61.jpg[/img]线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread...
2014-09-14 15:26:39
544
原创 异步I/O
用的不多,一些概念是模糊的,从网上整理了一些资料。方法一:使用fcntl来置O_ASYNC位。 这个方法的效果是,当输入缓存中的输入数据就绪时(输入数据[size=large][color=red]可读[/color][/size]),内核向用F_SETOWN来绑定的那个进程发送SIGIO信号。此时程序应该用getchar等函数将输入读入。 ...
2014-09-12 10:07:48
107
原创 Python连接sqlserver中文乱码的问题
第一次遇到这个问题,Google后才找到解决方法(百度果然还是太弱了啊),编码的问题还是不熟settings = {'CMT_SQLSERVER_DSN':'MerchantPrice','CMT_SQLSERVER_USERNAME':'readuser','CMT_SQLSERVER_PASSWD':'password'}conn = "DSN=%s;UID=%s;PWD=%s" ...
2014-09-04 09:59:21
1591
原创 关于linux中的Ctrl+C,Ctrl+Z【转】
Ctrl+C:送SIGINT信号,默认进程会结束,但是进程自己可以重定义收到这个信号的行为。Ctrl+Z:送SIGSTOP信号,进程只是被停止,再送SIGCONT信号,进程继续运行。ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF 有些信号不能被屏蔽,比如中断,还应该有杀死进程的信号,要不然内核怎么做操作系统中的老大。实际上,SIGKILL和SIGSTOP信号是...
2014-09-03 11:35:56
85
原创 Python的深拷贝和浅拷贝
Python的深拷贝和浅拷贝需要留意一下1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。2. copy.deepcopy 深拷贝 拷贝对象及其子对象一个很好的例子:import copya = [1, 2, 3, 4, ['a', 'b']] #原始对象b = a #赋值,传对象的引用c = copy.copy(a) #对象...
2014-09-02 10:06:34
170
原创 twisted框架
twisted框架是python实现的基于事件的优秀的框架,适合于网络编程等。一个server实例 # -*- coding: UTF-8 -*- #Twisted MMORPG from twisted.internet.protocol import Factory from twisted.protocols.basic import Li...
2014-09-01 15:44:44
170
原创 libevent实现的httpclient
还比较简单,主要是几个函数、结构体的使用#include #include #include "event2/event.h" #include "event2/http.h" #include "event2/buffer.h" #include "event2/http_struct.h" #include "event2/dns.h" ...
2014-08-31 23:15:20
557
原创 SO_REUSEADDR和SO_REUSEPORT【转】
在读TCP/IP协议时对这些概念比较熟悉,时间久了,有些模糊,就转一下,方便以后回顾。SO_REUSEADDR提供如下四个功能:SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只...
2014-08-30 10:48:22
162
原创 协同过滤(CF)【转】
注:其实是很简单的东西,只是数据挖掘理论的一个应用,只是了解一下amazon的算法,一些算法看似很简单,也很实用,效果也不错。在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题1 什么是协同过滤协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filte...
2014-08-30 08:20:08
129
原创 c++析构/构造函数与虚函数
虚函数的意义很简单,就是动态绑定,从而完成多态。没有太大的疑问。但是关于虚函数的使用,有两种情况比较特殊,需要留意:构造函数和虚构函数。在实例化一个类时,会按照父类-成员变量-子类的构造函数依次调用构造函数,析构的时候,会按照相反的次序依次调用析构函数。如果在构造函数/析构函数中调用虚函数,或者调用的一般成员函数(非虚函数)中调用了虚函数,情况会怎么样那?这种情况下,因为编译器知道...
2014-08-28 09:07:08
102
原创 正则表达式
转义符:[color=red]\s[/color] 空白字符:[ \t\n\x0B\f\r] //这个是重点!\t 制表符 ('\u0009') \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') \f 换页符 ('\u000C') \a 报警 (bell) 符 ('\u0007') \e 转义符 ('\u001B') \cx 对...
2014-08-26 11:40:28
79
原创 KMP算法【转】
一些时间没看了,有些生疏,拿出来熟悉一下。其实理解了原理就很简单了。KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字。其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n)。 在KMP算法中,为了确定在匹配不成功时,下次匹配时...
2014-08-23 10:34:35
114
原创 进程和线程的一些东西
上次和一个人谈到操作系统调度的问题,他说进程可以绑定CPU,线程不可以。我觉得不是,但是不确定,查了一下,是按照线程绑定的,参考:Linux系统提供API函数sched_setaffinity和sched_getaffinity用于设置或获取线程的可以使用的CPU核。int sched_setaffinity(pid_t pid, unsigned int cpusetsize, ...
2014-08-22 10:22:43
87
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人