首页
学习
活动
专区
工具
TVP
发布

蓝天

专栏作者
526
文章
833326
阅读量
41
订阅数
彻底理解C/C++指针
彻底理解C++指针.pdf 推荐阅读pdf版本,原因是从WPS复制粘贴到ChinaUnix后格式有些丢了。
一见
2018-08-10
6810
Cron运行原理
本文介绍的是由Paul Vixie开发的运行在SuSE Linux上的Cron。可以通过“man cron”进行确认。
一见
2018-08-10
3.8K0
进一步理解指针2:双指针、指针数组和数组指针
1) 如果int* p,则“1”实际是sizeof(int),也就是p指向的类型大小;
一见
2018-08-10
1.4K0
Failed connect to github.com:443; No error
任务目标:将线上已有的https://github.com/eyjian/mooon.git克隆到本地的E:\GitHub\mooon目录 问题描述:使用Git的Windows客户端UI工具GitHub执行克隆操作时报错,查看它的日志,难发现问题,于是改用Git的Windows命令行终端Git Shell操作,得到了较为详细的错误信息,基于错误提示解决了问题,过程描述如下。 打开Git Shell,进入本地的E:\GitHub目录,注意不是E:\GitHub\mooon目录,然后执行克隆命令git clone如下: E:\GitHub> git clone https://github.com/eyjian/mooon.git Cloning into 'mooon'... fatal: unable to access 'https://github.com/eyjian/mooon.git/': Failed connect to github.com:443; No error 遇到错误,克隆失败。通过执行telnet github.com 443,发现网络不通,于是想到设置代理,通过baidu找到设置proxy方法: 1) 打开文件.gitconfig,文件位于用户主目录下,执行ls ~即可看到它。假设Win7登录用户名为tom,则位于C:\Users\tom目录下 2)编辑.gitconfig,在文件尾加入以下内容: [http]     proxy = http://www.proxy.com:8080/ [http]顶格写,proxy前保留一个tab,其中www.proxy.com为代理服务器的IP或域名。 完成后,再次执行git clone https://github.com/eyjian/mooon.git,发现成功了。。。 对文件.gitconfig的操作,实际可以借助git命令来完成,而不必直接编辑.gitconfig,对应的子命令是git config --global,如:git config --global user.name "eyjian",则在.gitconfig文件中可以看到如下内容: [user]     name = eyjian 同理,配置proxy命令为:git config --global http.proxy http://www.proxy.com:8080/
一见
2018-08-10
1.9K0
mysql_init调用卡住原因分析
看似简单的代码,但非常不幸,程序运行时,卡在了mysql_init处。语法上看不出任何破绽,原因会是什么了?
一见
2018-08-10
1.2K0
apache thrift的不足
thrift作为RPC优点明显,那些还在坚持使用消息排斥RPC的同学,都应当亲自接触体验一下。 
一见
2018-08-07
7680
养成良好的编程习惯
4.从源头避免版本不一致问题(当同一个文件在不同目录下出现拷贝时,容易出现其中某个未同步更新的问题)
一见
2018-08-07
2970
MOOON分布式消息结构
MOOON主要消息结构如下,缺点是消息本身占用字节数较多: /*** * 分布式消息头结构 */ typedef struct TDistributedMessage {     net::common_message_header header; // 消息头     nuint32_t flags; // 标志字段     nuint32_t source_ip[IP_BYTES]; // 消息源的IP地址,如果是IPV4地址,则N值为1,否则为4     nuint32_t
一见
2018-08-07
1950
struct对齐问题
ChinaUnix最近有个贴子讨论热烈,在这里记录一下我的理解,struct的对齐是遵照下列二个条件中最小的一个进行的: 1.#pragma pack(N)中N指定的值 2.struct中最大的成员(请注意不是指sizeof值最大的那个,而应当是__alignof__值最大的那个) 对于double等几个类型,它的alignof值是可通过编译开关-mno-align-double和-malign-double来控制的,其中-mno-align-double表示double的alignof值为字长,而-mn
一见
2018-08-07
1.1K0
使用异步I/O大大提高应用程序的性能
aio_return 异步 I/O 和标准块 I/O 之间的另外一个区别是我们不能立即访问这个函数的返回状态,因为我们并没有阻塞在 read 调用上。在标准的 read 调用中,返回状态是在该函数返回时提供的。但是在异步 I/O 中,我们要使用 aio_return 函数。这个函数的原型如下: ssize_t aio_return( struct aiocb *aiocbp ); 只有在 aio_error 调用确定请求已经完成(可能成功,也可能发生了错误)之后,才会调用这个函数。aio_return 的返回值就等价于同步情况中 read 或 write 系统调用的返回值(所传输的字节数,如果发生错误,返回值就为 -1)。 aio_write aio_write 函数用来请求一个异步写操作。其函数原型如下: int aio_write( struct aiocb *aiocbp ); aio_write 函数会立即返回,说明请求已经进行排队(成功时返回值为 0,失败时返回值为 -1,并相应地设置 errno)。 这与 read 系统调用类似,但是有一点不一样的行为需要注意。回想一下对于 read 调用来说,要使用的偏移量是非常重要的。然而,对于 write 来说,这个偏移量只有在没有设置 O_APPEND 选项的文件上下文中才会非常重要。如果设置了 O_APPEND,那么这个偏移量就会被忽略,数据都会被附加到文件的末尾。否则,aio_offset 域就确定了数据在要写入的文件中的偏移量。 aio_suspend 我们可以使用 aio_suspend 函数来挂起(或阻塞)调用进程,直到异步请求完成为止,此时会产生一个信号,或者发生其他超时操作。调用者提供了一个 aiocb 引用列表,其中任何一个完成都会导致 aio_suspend 返回。 aio_suspend 的函数原型如下: int aio_suspend( const struct aiocb *const cblist[], int n, const struct timespec *timeout ); aio_suspend 的使用非常简单。我们要提供一个 aiocb 引用列表。如果任何一个完成了,这个调用就会返回 0。否则就会返回 -1,说明发生了错误。请参看清单 3。 清单 3. 使用 aio_suspend 函数阻塞异步 I/O struct aioct *cblist[MAX_LIST] /* Clear the list. */ bzero( (char *)cblist, sizeof(cblist) ); /* Load one or more references into the list */ cblist[0] = &my_aiocb; ret = aio_read( &my_aiocb ); ret = aio_suspend( cblist, MAX_LIST, NULL ); 注意,aio_suspend 的第二个参数是 cblist 中元素的个数,而不是 aiocb 引用的个数。cblist 中任何 NULL 元素都会被 aio_suspend 忽略。 如果为 aio_suspend 提供了超时,而超时情况的确发生了,那么它就会返回 -1,errno 中会包含 EAGAIN。 aio_cancel aio_cancel 函数允许我们取消对某个文件描述符执行的一个或所有 I/O 请求。其原型如下: int aio_cancel( int fd, struct aiocb *aiocbp ); 要取消一个请求,我们需要提供文件描述符和 aiocb 引用。如果这个请求被成功取消了,那么这个函数就会返回 AIO_CANCELED。如果请求完成了,这个函数就会返回 AIO_NOTCANCELED。 要取消对某个给定文件描述符的所有请求,我们需要提供这个文件的描述符,以及一个对 aiocbp 的 NULL 引用。如果所有的请求都取消了,这个函数就会返回 AIO_CANCELED;如果至少有一个请求没有被取消,那么这个函数就会返回 AIO_NOT_CANCELED;如果没有一个请求可以被取消,那么这个函数就会返回 AIO_ALLDONE。我们然后可以使用 aio_error 来验证每个 AIO 请求。如果这个请求已经被取消了,那么 aio_error 就会返回 -1,并且 errno 会被设置为 ECANCELED。 lio_listio 最后,AIO 提供了一种方法使用 lio_listio API 函数同时发起多个传输。这个函数非常重要,因为这意味着我们可以在一个系统调用(一次内核上下文切换
一见
2018-08-07
8200
高效的使用stl::map和std::set
if (map.find(X) == map::end()) // 需要find一次
一见
2018-08-07
2.9K0
与Innodb引擎有关的配置说明
skip-inodb 不加载INODB数据引擎驱动,如果项目不使用INNODB引擎,可以关闭,以节省系统内存 innodb-file-per-table 设置以后,为每个新数据表分别创建一个表空间tablespace文件,默认情况下都放在一个文件里,这样有弊端,以后我在自己博文中将单独对这个地方进行说明。 innodb_buffer_pool_size innodb的缓冲区大小,用来存放数据和索引,Innodb在线的文档表示要设置为机器内存的50%-80%来做这个缓冲区! 这个可以说是Innodb引擎下配置选项中最关键的参数选项了,对性能的影响也是最大的。 innodb_log_buffer_size InnoDB事务日志文件缓冲区大小,默认8M innodb_flush_method Innodb日志文件同步刷新的方法,取值有两个 fdatasync ,O_DSYNC,只是Uinx和linux系统下两个不同的调用函数区别。 innodb_additional_mem_pool_size innodb用于内部管理的各种数据结果分配的缓冲区大小,默认1M innodb_data_home_dir InnoDB数据文件的主目录 innodb_data_file_path Innodb 数据文件配置方式 innodb_log_files_in_group Innodb使用多少个日志文件,默认2 innodb_log_file_size Innodb日志文件最大限制尺寸,默认5M innodb_lock_wait_timeout 等待数据锁的超时时间,可以避免死锁,超过这个时间没有获取结果,就ROOLBACK回滚放弃。 innodb_flush_log_at_trx_commit Innodb日志提交的方式,0,1,2可供取值,0表示每间隔一秒就写一次日志并进行同步,减少了硬盘写操作次数,可以提高性能,1表示每执行完COMMIT就写一次日志并进行同步,默认值,2表示每执行完一次COMMIT写一次日志,每间隔一秒进行一次同步,这个参数在Innodb里同样是关键参数,对性能影响较大。 innodb_force_recovery 在Innodb的自动恢复失败后,从Crash中强制启动
一见
2018-08-07
2950
汇编指令: VERW、WAIT、WBINVD、WRSHR、WRMSR、XADD、XBTS、XCHG、
名称 功能 操作数 操作码 模数 寄存器1 寄存器2或内存 位移量 立即数 符号 方向 芯片型号 16位 32位 VERR 校验读 寄16 $0F00 11 100 5 无 无 无 无 286 无 无 VERR 校验读 [寄16] $0F00 00 100 5 无 无 无 无 286 无 $67 VERR 校验读 [寄32] $0F00 00 100 5 无 无 无 无 286 $67 无 VERR 校验读 [寄16+位移8] $0F00 01 100 5 9 无 无 无 286 无 $67 VERR 校验
一见
2018-08-07
5570
怎样取得文件行数
perl -ne 'END {print "$i"} ++$i' filename
一见
2018-08-07
1.3K0
基于zookeeper的主备切换方法
继承CZookeeperHelper即可快速实现主备切换: https://github.com/eyjian/mooon/blob/master/mooon/include/mooon/net/zookeeper_helper.h zookeeper的ZOO_EPHEMERAL节点(如果ZOO_EPHEMERAL满足不了需求,可以考虑和ZOO_SEQUENCE结合使用),在会话关闭或过期时,会自动删除,利用这一特性可以实现两个或多节点间的主备切换。 实现方法: 1)在进程启动时调用zookeeper_init()初始化: bool X::init_zookeeper() {     // 第一次调用时_clientid总是为NULL,     // 状态为ZOO_EXPIRED_SESSION_STATE时,需要重新调用zookeeper_init,     // 这个时候可传入的_clientid为前一次zookeeper_init()产生的_clientid     // 请注意zookeeper_init()是一个异步调用,返回非NULL并不表示会话建立成功,     // 只有当zk_watcher中的type为ZOO_SESSION_EVENT和state为ZOO_CONNECTED_STATE时,     // 才真正表示会话建立成功。     _zhandle = zookeeper_init(zk_hosts, zk_watcher, 5000, _clientid, this, 0);     if (NULL == _zhandle)     {         MYLOG_ERROR("init zookeeper failed: %s\n", zerror(errno));         return false;     }     MYLOG_INFO("init zookeeper(%s) successfully\n", zk_hosts);     return true; } 2)进入工作之前,先尝试切换成主,只有成功切换成主后才进入work bool X::run() {     while (true)     {         int num_items = 0;         // 备机最简单的方法是每隔一定时间,如1秒就尝试转成master,         // 如果不使用轮询,则可以采用监视_zk_path的方式         mooon::sys::CUtils::millisleep(1000);         // 如果不是master,则尝试转成master,如果转成不成功则继续下一次尝试         if (!is_master() && !change_to_master())             continue;         do_work();     } } bool X::is_master() const {     return _is_master; } bool X::change_to_master() {     static uint64_t log_counter = 0; // 打log计数器,备状态时的日志输出     // ZOO_EPHEMERAL|ZOO_SEQUENCE     // _myip为本地IP地址,可以通过它来判断当前谁是master     // _zk_path值示例:/master/test,注意需要先保证/master已存在     int errcode = zoo_create(_zhandle, _zk_path.c_str(), _myip.c_str(), _myip.size()+1, &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, NULL, 0);     // (-4)connection loss,比如为zookeeper_init()指定了无效的hosts(一个有效的host也没有)     if (errcode != ZOK)     {         _is_master = false;         // 减少为备状态时的日志输出         if (0 == log_counter++ % 600)         {             MYLOG_DEBUG("become master[%s] failed: (%d)%s\n", _zk_path.c_str(), errcode, zerror(er
一见
2018-08-02
1.9K0
一种基于Redis的10行代码实现IP频率控制方法
优点:可支持海量访问的频率控制,只需要增加Redis机器,单个Redis节点(只占用一个cpu core)即可支持10万/s以上的处理。 基于IP频率限制是种常见需求,基于Redis可以十分简单实现对IP的频率限制,具体手段为利用Redis的key过期和原子加减两个特性。 以IP作为key,频率为key过期时长,比如限制单个IP在2秒内频率为100,则key过期时长为2秒,基于r3c(a Redis Cluster C++ Client)的实现大致如下:
一见
2018-08-02
5350
Linux后台开发常用工具
pwdx - report current working directory of a process,格式:pwdx pid 内存分析工具 valgrind valgrind辅助工具 qcachegrind 可视化查看valgrind结果 淘宝DBA团队发布的监控脚本,使用perl开发,可以完成对linux系统和MySql相关指标的实时监控 orzdba  取指定进程名的pid pidof 进程名 性能瓶颈查看: perf top -p pid 查看调用栈: pstack pid https://www.percona.com/ 查询程序执行聚合的GDB堆栈跟踪,先进性堆栈跟踪,然后将跟踪信息汇总: pt-pmp -p pid 格式化explain出来的执行计划按照tree方式输出,方便阅读: pt-visual-explain 从log文件中读取插叙语句,并用explain分析他们是如何利用索引,完成分析之后会生成一份关于索引没有被查询使用过的报告: pt-index-usage 其它: vmstat tcpdump 网络数据包分析器   显示包的内容:   tcpdump -i eth1 -n -vv -x -e -s 600 # 仅二进制   tcpdump -i eth1 -n -vv -X -e -s 600 # 二进制和文本   抓包保存到文件供Wireshark分析:   tcpdump -i eth1 -n -vv -X -e -s 600 -w x.cap   抓取192.168.31.1的80端口的包   tcpdump -i eth1 host 192.168.31.1 and port 80   抓取目标IP为192.168.31.1和目标端口为80端口的包   tcpdump -i eth1 dst host 192.168.31.1 and dst port 80 -s 指定显示多少字节的包内容 objdump nm ldd strings iostat 输入/输出统计 ifstat 网络流量实时监控工具 vmstat 虚拟内存统计 sar (System Activity Reporter系统活动情况报告,最为全面的系统性能分析工具之一) iptraf 实时IP局域网监控 iftop 网络带宽监控 htop 进程监控 iotop 磁盘I/O监测工具 fuser 使用文件或文件结构识别进程 lsof 打开文件列表 dmesg slabtop free slurm 查看网络流量 byobu 类似于screen tmux 终端复用工具,类似于screen screen 在多个进程之间多路复用一个物理终端的窗口管理器 dtach 用来模拟screen的detach的功能的小工具 dstat 可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品 NetHogs 监视每个进程的网络带宽 MultiTail 同时监控多个文档、类似tail Monitorix 系统和网络监控 Arpwatch 以太网活动监控器 Suricata 网络安全监控 Nagios 网络/服务器监控 Collectl 一体化性能检测工具 mtr 网络连通性判断工具,集成了traceroute和ping socat 多功能的网络工具(Socket CAT,netcat加强版) netpipes socket操作 ab wget curl tsung 压力测试工具 siege 压力测试和评测工具 nmon 监控Linux系统性能 psacct 监视用户活动 ncdu 基于ncurses库的磁盘使用分析器 slurm 实时网络流量监控 findmnt 查找已经被挂载的文件系统 saidar 系统数据监控和统计工具 ss 可以替代netstat的网络连接查看工具(socket statistics) ccze 用不同颜色高亮日志协助管理员进行区分和查看分析 netstat 网络统计 ifconfig (ifup ifdown) Linux磁盘相关命令 sfdisk -l sfdisk -s fdisk -l dmesg |grep SCSI dmesg |grep -i raid df -h cat /proc/scsi/scsi hdparm /dev/sda mount 加载一块硬盘 mkfs 创建文件系统 /etc/fstab 文件内容mount命令输出一致 lscpu 查看CPU lspci
一见
2018-08-02
1.4K0
HBase Thrift2 CPU过高问题分析
外界连接9090端口均超时,但telnet端口总是成功。使用top命令观察,发现单个线程的CPU最高达99.99%,但并不总是99.9%,而是在波动。当迁走往该机器的流量后,能够访问成功,但仍然有超时,读超时比写超时多:
一见
2018-08-02
6320
iptables简单应用
可以修改/etc/rc.d/boot.local让规则重启后也能生效,如: /sbin/iptables -F /sbin/iptables -A INPUT -i eth0 -p tcp --sport 80 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -p tcp -j DROP /sbin/iptables -A INPUT -i eth0 -p udp -j DROP iptables是一个链的方式从前往后判断,如果前面的规则成立就不会往后继续,所以要注意顺序,一般每行对应一条规则。 -A是Append意思,也就是追加 -I是Insert意思,也就是插入 -F表示清除(即删除)掉已有规则,也就是清空。 查看已有的规则,执行命令:iptables -L -n 如(参数-L为list意思,-n表示以数字方式显示IP和端口,不指定-n则显示为名称,如:http即80端口): # iptables -L -n Chain INPUT (policy ACCEPT) target     prot opt source               destination          ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:443 ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:80 DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            DROP       udp  --  0.0.0.0/0            0.0.0.0/0            Chain FORWARD (policy ACCEPT) target     prot opt source               destination          Chain OUTPUT (policy ACCEPT) target     prot opt source               destination  从可以看到:iptables有三种规则链(Chain),即INPUT、OUTPUT和FORWARD。 INPUT 用于指定输入规则,比如外部是可以访问本机的80端口 OUTPUT 用于指定输出规则,比如本机是否可以访问外部的80端口 FORWARD 用于指定端口转发规则,比如将8080端口的数据转到到80端口 -I和-A需要指定链(Chain)名,其中-I的链名后还需要指定第几条(行)规则。 可通过-D参数删除规则,有两种删除方式,一是匹配模式,二是指定第几条(行)。 也可以通过-R参数修改已有规则,另外-L参数后也可以跟链(Chain)名,表示只列出指定链的所有规则。 -j参数后跟的是动作,即满足规则时执行的操作,可以为ACCEPT、DROP、REJECT和REDIRECT等。 在iptables的INPUT链的第一行插入一条规则(可访问其它机器的80端口): iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT 在iptables的INPUT链尾追加一条规则(可访问其它机器的80端口): iptables -A INPUT -p tcp --sport 80 -j ACCEPT 如果要让其它机器可以访问本机的80端口,则为: iptables -A INPUT -p tcp --dport 80 -j ACCEPT 插入前: # iptables -L -n Chain INPUT (policy ACCEPT) target     prot opt source               destination          DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            DROP       udp  --  0.0.0.0/0            0.0.0.0/0   插入: # iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT 插入后: # iptables -L -n Chain INPUT (policy ACCEPT) target     prot opt source               destination          A
一见
2018-08-02
4240
没有更多了
社区活动
RAG七天入门训练营
鹅厂大牛手把手带你上手实战
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档