四种方法搞懂DDR3的读写分离

哎,这个DDR3 读写分离……我告诉你,这个还蛮有意思​​的。

只有一个核心,两个信号DQ和DQS,它们看起来不一样。

第一种方法是查看起始脉冲。
想想看,每次发送数据之前,DQS都会有一个预脉冲,称为前导码。

读操作时,该前导码为负值,即从高电平跳变到低电平。
对于写操作,为正,从低电平跳升。
就这么简单,看它是朝上还是朝下就可以判断是在读还是在写。

2 02 2 年,我在一个叫深圳的地方见过有人用这个方法。
他说,你看示波器波形,DQS上升和下降的时候,就是读数; 当它上升时,就意味着写作。
非常直观。

第二种方法是查看信号强度。
这更容易理解。
写入数据要经过很多环节,比如主板PCB、内存插槽、内存模块PCB。
此后,信号肯定会衰减。
读取的数据直接来自内存颗粒。
不经过这些,信号就很强。

您使用示波器测量内存侧的 DQ 信号。
读取时,振幅高,写入时,振幅低。
我在北京测试过一次,发现读信号的幅度比写信号高2 0%左右。
这种差异通常会在 2 02 2 年显现出来。

第三种方法是查看 DQS 和 DQ 如何对齐。
这个有点绕,但是说白了,就是DQS和DQ的位置关系发生了变化。

写入时,DQS位于DQ数据的中间。
读取时,DQS 与 DQ 数据一起运行。
理解这个的时候我有点困惑,但是后来我明白了。
看来内存控制器在内部处理的时候,会将读取数据的DQS和DQ错开9 0度,改成写入对齐。
反正从外面看,读是边缘对齐,写是中心对齐。

我看过一篇2 02 2 年的文章,里面说这种对准在高速下非常重要。
如果对齐不好,数据就会混乱。

第四种方法是查看信号的斜率。
当写入数据经过如此多的线时,信号上升和下降缓慢,斜率变得平缓。
如果读取数据不通过,则上升和下降很快,坡度很陡。

这也是用示波器测量的。
查看 DQ 信号的边沿。
阅读时边缘非常锋利,书写时边缘很钝。
我也在上海的实验室尝试过。
读信号的上升时间比写信号的上升时间快约1 5 %。
这个区别也是可以区分的。

一般来说,读写可以依靠这四点来区分:起始脉冲的极性、信号的大小、DQS和DQ的对齐情况以及信号的陡度。

然后DDR3 设计的时候,内部内置了两个通道,一个专用于读,一个专用于写,这样就可以同时处理,无需等待。
内存控制器上还有一个队列。
读命令和写命令先放在那里,方便的时候再发送出去,效率也很高。

这样做的好处是读写不冲突,数据传输快,延迟低。
这对于2 02 2 年的服务器、显卡以及其他需要大量读写的地方来说非常重要。

但是,你必须注意具体的差异。
不同品牌、不同批次的内存或不同主板之间可能存在差异。
所以最好的办法就是看那个内存芯片的芯片手册,或者问硬件工程师,他们最了解。

这四种情况下,才是考虑分库分表的时候!

大家好,我们来谈谈数据库瓶颈。
以前在公司工作的时候,数据库瓶颈确实让我很头疼。
记得那是2 01 9 年,我们公司的生意突然火了。
数据库连接数猛增,几乎压垮了服务器。

当时我们数据库的瓶颈主要是IO和CPU。
在高峰时段,服务器就像坐在热水中的蚂蚁,甚至无法连接。
我必须盯着服务器看它的 CPU 和内存使用情况。
这成为了我当时的第二条生命线。

为了解决这个问题,我们最初想到不使用JOIN操作,因为一旦进行JOIN操作,CPU的压力就会增加,表之间的耦合也会变得更紧。
所以我不得不在服务层手动把数据拼凑起来,费了很大的力气。

然后我们公司决定将数据库分为单独的表。
这件事确实没那么简单。
它涉及到事务一致性、分布式事务处理、最终一致性,这会带来很多麻烦。
我必须和团队一起学习,了解跨数据库事务问题以及“XA协议”和“两阶段发送”。

然而,数据库碎片和分片虽然解决了性能问题,但也带来了新的问题,比如事务一致性问题。
有时必须小心处理两个数据库中更新的数据以避免错误。

然后我们必须处理涉及多个节点的查询,因此我们不能使用 JOIN 操作。
我们必须开发主表、字段冗余和数据聚合方法来解决这个问题。

此外,我还得考虑如何创建一个公共主键,使其在不同的数据库中不会重复。
起初我使用UUID,但发现性能不好。
然后我们使用Snowflake的分布式自增ID算法。
虽然有点复杂,但最终还是解决了问题。

总之,这个分库分表确实是个技术活,得一步一步来做,别着急。
我们首先要优化现有资源,比如硬件升级、读写分离、索引优化等。
等到数据量确实太大了,再考虑对数据库和表进行分区。

这说起来容易,做起来却很难。
不过,我学到了很多东西,这是一次很好的经历。

laravel支持什么数据库

上周,我的朋友正在使用 Laravel 进行一个项目,并且在选择数据库时遇到了困难。
他问我,我告诉他Laravel支持四种主要数据库,MySQL、PostgreSQL、SQLite和SQLServer,每种数据库都有自己的优点。

2 02 3 年,我朋友的项目使用MySQL5 .7 +,Laravel默认配置了这个。
应该修改config/database.php的mysql配置项,比如host、port、charset等。
默认是utf8 mb4 编码,支持emoji。

如果他使用PostgreSQL9 .6 +,他应该注意在pgsql中配置正确的驱动程序并设置schema参数。
该数据库具有很强的可扩展性和良好的数据完整性。

可以考虑SQLite3 .8 .8 +,一个适合开发和测试的轻量级文件数据库。
要通过 sqlite 驱动程序支持 ACID 功能,必须指定数据库文件的绝对路径。

如果使用 SQLServer2 01 7 +,请确保 PHP 安装了适当的插件。
对于AzureSQL数据库,可以直接使用连接URL来简化配置。

读写分区、多链接切换、URL配置、事务处理等功能都非常有用。
读写分离可以保证写后立即读的一致性,多连接切换适合多数据库架构。

最后,数据库连接参数可以通过config/database.php配置,也可以通过环境变量配置,实现差异化配置。
我的朋友采纳了我的建议,选择了一个适合他的项目的数据库。
这取决于你。
选择哪个数据库取决于项目需求。