首页
关于
Search
1
Lua使用调试库hook函数调用
333 阅读
2
傻瓜式快速搭建l2tp
329 阅读
3
Linux内核数据结构kfifo小结(TODO)
269 阅读
4
傻瓜式安装chatgpt-web工具
256 阅读
5
游戏邮件系统数据设计因素
243 阅读
项目技术
项目思考
开发环境
数据库
编程语言
生活与阅读
哲学
登录
Search
标签搜索
nodejs
npm
韭菜笔记
累计撰写
55
篇文章
累计收到
0
条评论
首页
栏目
项目技术
项目思考
开发环境
数据库
编程语言
生活与阅读
哲学
页面
关于
搜索到
54
篇与
的结果
哈希冲突TODO
设计哈希表时,选择不同的哈希函数有不同性能表现。重点在于哪种散列函数可以有效避免冲突。如果出现了冲突,一般都有哪些冲突解决办法。线性探测二次探测开链法(GCC使用的SGI版本STL就是基于此方法) 虽然开链法并不要求表格大小必须为质数,但SGI STL 仍然以质数来设计表格大小,并且将28个质数(逐渐呈现大约两倍的关系)计算好,以备随时访问,同时提供一个函数,用来查询在这28个质数之中,“最接近某数并大于某数”的质数。在JDK8以前也是使用链表来处理冲突。JDK8以后在链表超过8时使用平衡树来存储。建议使用头插法而不是尾插法入链。因为最近增加的元素有很大概率被下次访问。常见的哈希算法:MD5SUM、SHA1、DJBX33A(Java HashCode)、CRC32(部分硬件原语加速)、CRC16、MurMurHash(速度比MD5快)、SipHash(Redis\Python使用)哈希算法从安全性又可以分两类加密哈希函数如SHA非加密哈希函数。服务器中使用哈希算法需要考虑:哈希攻击(hash flooding attack)。不要对不明数据进行哈希。而MurMurHash和SipHash使用了种子的概念实现随机化哈希,增加了攻击的难度。因此SipHash也被称为带密钥哈希算法(Keyed Hash Function),天生免疫哈希攻击。加盐哈希方案。通过增加一些随机的盐参数,把需要加密的账号密码更安全的存储。
2021年06月26日
11 阅读
0 评论
0 点赞
Groovy语法
Groovy运行于Java虚拟机上的,所以语法也自然支持Java语法。他也有对Java语法的扩展。注意Java是静态强类型语言, 而Groovy是一个动态强类型语言。前面也已经说了他是运行于Java虚拟机上的,自动是需要安装JVM环境的。更具体的安装可以参考官网方法。如果只是为了熟悉其语法,更便捷的办法是使用线上IDE学习。比如这个:https://groovyide.com/cpi变量定义关键字def:def str = "hello world";// 定义一个字符串 def str2 = "${str}!"; // 字符串支持插值 println(str2); // 一个跨行长字符串,不支持插值 def str3 = ''' 1)正式后台 2)测试后台 '''; print(str3.replaceAll('\\s+','').trim());查看动态类型信息和断言使用 // 查看动态类型信息和断言使用 def mixed = 1; assert mixed.class == java.lang.Integer; mixed = "str"; assert mixed.class == java.lang.String; //函数调用时,参数可以不使用括号 println mixed.class.name assert mixed.class == java.lang.Integer:"not a integer" assert mixed.getClass() == java.util.HashMap : "not valid select" assert backends instanceof java.lang.Integer : "not a Integer"支持Java写法, 注意数据和字典都是使用[]符号定义,只是后者还需要使用:指定valuedef dict = ['name':'john','age':14,'sex':'boy']; //println dict dict.each{ def kv = String.format("%s == %s", it.getKey(), it.getValue()); println kv; }支持闭包
2021年06月26日
8 阅读
0 评论
0 点赞
Redis在游戏的运用(二)
在读多写少的场景,有必要进行热点数据的缓存。缓存可以有效减少DB的读压力。这样的解决方案常见的DB也是具备的。不管是Redis还是MySQL或者是MongoDB, 都有复制集群的概念。只要使用从节点读数据,主节点写数据即可。MongoDB Atlas号称可以秒级别内同步新数据到从节点。这种方案也可以称为主写从读实现读写分离。说完减少主节点压力的优点,缺点也由此引入。这种方案只能实现数据的最终一致性,无法实现强一致性。DB数据的写入一般如下:应用层insert/update/delete返回时只是更新cache和Redo,Undo日志(在Mongodb中是更新oplog),并没有真正写入磁盘。主从binaryLog/Oplog同步延迟。比如机房间网络延迟问题、服务器负载问题等。即使忽略上面同步延迟问题,是不是就没有其他问题了?DB内部的缓存模块对热点数据的定义是死的,他缓存的数据可能不是我们我们认为的热点数据。因为他负责了多个维度数据的读写。比如我只访问了一次的数据,可能因为LRU原因,真正频繁热点数据被置换出缓存。有时我们想自己定义热点数据,比如近期1小时登录的玩家(这里不仅仅包含当前在线玩家)。这里补充扩展下有意思点,MySQL使用了自己改进后的LRU算法,使用了热数据插入队列前进5/8位置。这种优化可以屏蔽全表等大面积遍历引起热点数据的完全失效。于是引进了Redis这类内存DB。在进行写时,如果是需要强一致性。先删除Redis缓存(强迫读请求去DB加载)写入DB(写入会有锁,此时会阻塞读)再删除Redis缓存(即使有读请求在1和2的过程中取到旧数据,这里也会让旧缓存失效)如果需要最终一致性:设置缓存过期时间写入DB总是先尝试更新Redis数据再进行DB更新。如果Redis没有对应数据时可以考虑不进行写入的。因为可能不是热点数据>。另外如果宕机,连接不上也不需要进行更新Redis缓存。在进行读操作时,总是先尝试从Redis中取。如果没有再从DB取。这里要使用布隆过滤防止缓存穿透问题。从DB取数据返回时也写入Redis缓存。这里要注意两个问题:缓存击穿问题:对一个数据有并发多个请求加载。此时要排队加锁。真正进入DB加载时总是先尝试Redis取。更新Redis时缓存雪崩问题。数据过期时间最好进行一个随机,防止某个时间大量数据同时过期而缓存失效。
2021年06月26日
121 阅读
0 评论
0 点赞
2021-06-26
MongoDB内存分析实践
问题现象:外服120W数据DB>使用了12GB内存,但同样的数据导入一个开发实例,只占用了5GB
2021年06月26日
131 阅读
0 评论
0 点赞
关于IRQ亲和性资料整理笔记
中断处理也是可以设置更倾向在哪个CPU核心处理的。碰到这个问题是来自于中断机制一次QQ聊天中。在中断被频繁触发时CPU会处理不过来,常见的现象是网卡不能满负荷的跑,达到一定流量后出现了丢包。这又要从网卡接收数据开始说起。 网卡驱动启动时就会注册硬中断回调同时准备好sk_buffer。在网络包来的时候NIC会通过DMA(Direct Memory Access,不经过CPU的内存复制,也称零拷贝)把数据包从NIC内部缓存区复制到之前准备好的sk_buffer中(如果此时sk_buffer不足是会丢包,对应ifconfig命令overruns指标)。之后NIC产生一个硬中断。硬中断处理程序只会处理关键性的、短时间内可以处理完的工作,剩余耗时较长工作,会放到中断之后,由软中断来完成。硬中断也被称为上半部分。CPU收到硬中断,根据中断描述符表(Interrupt Descriptor Table,IDT)找到处理函数并调用。最后触发NET_RX_SOFTIRQ软中断处理sk_buffer中的数据(如果软中断处理不及时,轮询时CPU对应的接收队列超过netdev_max_backlog也会丢包),然后再交给内核协议栈解析处理,协议栈会得到sk_buffer,经过处理后进入socket buffer, 最后用户态取得数据。对于多队列(RSS特性)网卡, 每个队列对对应一个中断号。因为中断号的不同,可以设置不同的CPU亲和性。这样在单核CPU无法跟上网卡速度的问题就通过多核解决了。对于单队列网卡一般使用RPS+RFS配合使用。RPS(Receive Packet Steering)帮助单队列网卡将其产生的SoftIRQ分派到多个CPU内核进行处理。RFS(Receive Flow Steering)能够保证处理软中断和处理应用程序是同一个CPU,达到局部性原理。通过ethtool -S ens5可以看到各队列信息queue_{idx}_*。ls /sys/class/net/ens5/queues/在机器CPU处理很多计算任务,CPU压力紧张的情况下扩展多队列网卡是没有效果的,多队列网卡就是要通过消耗更多的CPU来提高网络性能,此时CPU压力更大,会影响计算业务。最佳实践方式是通过设定中断亲和性(修改/proc/irq/{IRQ_ID}/smp_affinity配置)把业务进程的亲和性(taskset命令)绑定到不同的CPU上,这样不会相互影响。IRQ_ID可以通过grep ens5 /proc/interrupts得到,具体设置方法网上很多。除了top可以查询中断处理统计,mpstat -P ALL 1更加具体
2021年06月26日
67 阅读
0 评论
0 点赞
1
...
9
10
11