LBA
逻辑区块地址(Logical Block Address, LBA)是描述计算机存储设备上数据所在区块的通用机制,一般用在像硬盘这样的辅助记忆设备。LBA可以意指某个数据区块的地址或是某个地址所指向的数据区块。现今计算机上所谓一个逻辑区块通常是512或1024位组(512字节)。ISO-9660格式的标准CD则以2048位组为一个逻辑区块大小。
一个LBA的大小是512B,可以将其理解为一个管理单位。
LBA定址机制
LBA是非常单纯的一种定址模式﹔从0开始编号来定位区块,第一区块LBA=0,第二区块LBA=1,依此类推。这种定址模式取代了原先操作系统必须面对存储设备硬件构造的方式。最具代表性的首推CHS(cylinders-heads-sectors,磁柱-磁头-扇区)定址模式,区块必须以硬盘上某个磁柱、磁头、扇区的硬件位置所合成的地址来指定。CHS模式对硬盘以外的设备来说没什么作用(例如磁带或是网络存储设备),所以通常也不会用在这些地方。过去MFM(Modified Frequency Modulation, 改良调频式)和RLL(Run Length Limited)存储设备都曾使用CHS模式,ATA-1设备更将延伸CHS(Extended Cylinders-Heads-Sectors, ECHS)也派上了用场。
SCSI采用LBA抽象定址。实际上硬件控制器还是以CHS来定址区块,但无论驱动程序还是任何以低级访问磁盘的应用程序(例如数据库软件)通常都不再需要这个参数。各种要求区块低级访问的系统调用把定义好的LBA传给驱动程序﹔最直接的情况下(逻辑器件与实体设备单一对应)驱动程序只是将LBA再传给硬件控制器。
LBA对应与逻辑器件虚拟化
当逻辑器件是经由虚拟化或是集合所构成的,像是RAID(磁盘阵列)和SANs(Storage Area Network)这种复杂的情况,就得把应用程序根据其观点中的磁盘来指定的LBA转换成每个实体存储设备上的LBA。在复杂的分布式存储结构下,从发出要求的应用程序到实体甚至是远程设备之间,会有太多这样的LBA转换。
bit和byte的区别
bit和byte的主要区别在于它们代表的不同大小的单位,以及它们在数据存储和传输中的应用。
bit,全称为binary digit,中文中称作比特,是二进制数系统中最小的单位,它代表一个二进制数,即0或1。一个bit可以表示的最小信息量是两个选项中的一个,比如真或假、0或1。
byte,全称为binary byte,中文中称作字节,是由8个bits组成。它是计算机中数据存储的基本单位,可以用来代表一个字符(如英文字母)、数字、或符号等。在计算机系统中,通常以字节(Byte)为单位来衡量数据量的大小,例如文件大小和存储容量。
另外,bit主要用于衡量信息传输的速度,如网速、数据传输速度等。而byte则主要用于衡量计算机中存储的数据量。在日常生活中,如描述计算机的运行内存或硬盘容量时,通常使用字节(Byte)为单位。而在讨论数据传输速率时,如互联网连接速度或数据传输速率时,则常用比特(bit)为单位。
IOPS
IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),指的是系统在单位时间内能处理的最大的I/O频度,是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更已关注吞吐量指标。
IOPS测试结果与很多测试参数和存储系统具体配置有关.IOPS可细分为100%顺序读,100%顺序写,100%随机读,100%随机写等,在同等情况下这四种IOPS中100%顺序读的IOPS最高。
吞吐量和带宽
吞吐量(throughput):指的是单位时间内最大的I/O流量;一些大量的顺序文件访问,更多考虑throughput指标。
带宽(band width)又叫频宽,是指在固定的的时间可传输的资料数量,亦即在传输管道中可以传递数据的能力。在数字设备中,频宽通常以bps表示,即每秒可传输之位数。在模拟设备中,频宽通常以每秒传送周期或赫兹 (Hz)来表示。
吞吐量与带宽的区分:吞吐量和带宽是很容易搞混的一个词,两者的单位都是Mbps。先来看两者对应的英语,
吞吐量:throughput;带宽:Max net bitrate。当讨论通信链路的带宽时,一般是指链路上每秒所能传送的比特数,它取决于链路时钟速率和信道编码在计算机网络中又称为线速。可以说以太网的带宽是10Mbps。但是需要区分链路上的可用带宽(带宽)与实际链路中每秒所能传送的比特数(吞吐量)。通常更倾向于用“吞吐量”一次来表示一个系统的测试性能。这样,因为实现受各种低效率因素的影响,所以由一段带宽为10Mbps的链路连接的一对节点可能只达到2Mbps的吞吐量。这样就意味着,一个主机上的应用能够以2Mbps的速度向另外的一个主机发送数据。
带宽决定于整个阵列系统,与所配置的磁盘个数也有一定关系;而IOPS则基本由阵列控制器完全决定。在Web、E-mail、数据库等小文件频繁读写的环境下,性能主要是由IOPS决定。在视频、测绘等大文件连续读写的环境下,性能主要由带宽决定。可见,在不同的应用方式中,需要考察的侧重点也不同;对于NAS产品来说,主要性能指数也是两个:OPS和ORT,分别代表每秒可响应的并发请求数和每个请求的平均反应时间。对磁带存储设备来说,单个磁带驱动器的读写速度是最重要的性能指标。
决定IOPS的主要取决与阵列的算法,cache命中率,以及磁盘个数。阵列的算法因为不同的阵列不同而不同,如我们最近遇到在hds usp上面,可能因为ldev(lun)存在队列或者资源限制,而单个ldev的iops就上不去,所以,在使用这个存储之前,有必要了解这个存储的一些算法规则与限制。cache的命中率取决于数据的分布,cache size的大小,数据访问的规则,以及cache的算法,如果完整的讨论下来,这里将变得很复杂了。我这里只强调一个cache的命中率,如果一个阵列,读cache的命中率越高越好,一般表示它可以支持更多的IOPS,为什么这么说呢?这个就与我们下面要讨论的硬盘IOPS有关系了;
吞吐量主要取决于阵列的构架,光纤通道的大小(现在阵列一般都是光纤阵列,至于SCSI这样的SSA阵列,我们不讨论)以及硬盘的个数。阵列的构架与每个阵列不同而不同,他们也都存在内部带宽(类似于pc的系统总线),不过一般情况下,内部带宽都设计的很充足,不是瓶颈的所在。光纤通道的影响还是比较大的,如数据仓库环境中,对数据的流量要求很大,而一块2Gb的光纤卡,所能支撑的最大流量应当是2Gb/8(小B)=250MB/s(大B)的实际流量,当4块光纤卡才能达到1GB/s的实际流量,所以数据仓库环境可以考虑换4Gb的光纤卡。最后说一下硬盘的限制,这里是最重要的,当前面的瓶颈不再存在的时候,就要看硬盘的个数了。
大文件持续传输型的应用需要的是充分的带宽性能,而小文件随机读写的应用则要求足够的I/O能力。那么多大的文件算“大文件”呢?一般而言,超过1MB大小的文件就可以算做“大文件”了。如果您的应用系统处理的资料中,最小的文件也有4~5MB甚至几十MB,就需要重点考察存储系统的带宽性能了。如果您的应用是数据库形式,或是电子邮件系统,系统中有大量KB级大小的文件,那么就可以忽略掉产品介绍中xxx MB/s的字样,重点关心xxx IOPS就可以了。
时间戳
TIMESTAMP 实际存储的内容为‘1970-01-01 00:00:00’到现在的毫秒数。在 MySQL 中,由于类型 TIMESTAMP 占用 4 个字节,因此其存储的时间上限只能到‘2038-01-19 03:14:07’。
postgres降低落盘带宽
在PostgreSQL中,降低数据库写入操作对磁盘带宽的影响可以通过以下方法实现:
使用fsync设置:在postgresql.conf文件中,设置fsync参数为on(默认值),或者设置为every-sync以最大程度减少I/O带宽。
使用synchronous_commit设置:将synchronous_commit设置为local或off可以减少每个事务的I/O带宽。
使用wal_buffers和wal_writer_delay设置:调整WAL(Write-Ahead Logging)缓冲区和WAL写入延迟可以减少日志文件的I/O带宽。
使用checkpoint_segments和checkpoint_timeout设置:调整检查点的频率可以减少检查点时的I/O带宽消耗。
使用bgwriter_delay和bgwriter_lru_maxpages设置:调整后台写入进程的行为可以减少其对I/O带宽的影响。
以下是一些相关参数的配置示例:
# 在postgresql.conf中
fsync = on # 或者 "every-sync"
synchronous_commit = local # 或者 "off"
# WAL相关设置
wal_buffers = 1MB # 根据内存大小调整
wal_writer_delay = 200ms # 根据需要调整
# 检查点相关设置
checkpoint_segments = 3 # 根据需要调整
checkpoint_timeout = 30min # 根据需要调整
# 后台写入进程设置
bgwriter_delay = 10ms # 根据需要调整
bgwriter_lru_maxpages = 100 # 根据内存大小调整
调整这些参数后,需要重启PostgreSQL服务使配置生效。在进行这些调整时,应当考虑到减少I/O带宽可能会增加数据丢失的风险,因此在生产环境中应当谨慎操作,并确保有适当的备份和恢复策略。
我们先来分析下 Postgres。在这个负载下,Postgres 的性能瓶颈在磁盘带宽上。这是因为云硬盘的 IOPS 很高(4800),带宽比较小(仅 140MB),而默认的 checkpoint 频率比较高(WAL 日志量累积满 1GB 就触发),因此写放大比较大,很快就跑慢了磁盘带宽(4 线程就跑满了)。
暂无评论内容