Linux性能优化-磁盘I/O优化

这篇具有很好参考价值的文章主要介绍了Linux性能优化-磁盘I/O优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.文件系统

1.1.文件系统工作原理 

1.1.1.索引节点和目录项

1.1.2.虚拟文件系统

2.磁盘I/O工作原理

2.1.磁盘类型

2.1.1.根据介质不同分类

2.1.2.磁盘按照接口分类

2.1.3.按照使用方式分类

2.2.IO栈 

3.性能指标

3.1.磁盘I/O性能指标

3.2.磁盘I/O观测 

3.3.进程I/O观测

3.3.1.pidstat 观测I/O

3.3.2.iotop 观测I/O

4.性能工具

5.磁盘I/O优化策略

5.1.应用程序优化策略

5.2.文件系统优化策略

5.3.磁盘优化策略


1.文件系统

1.1.文件系统工作原理 

        文件系统是在磁盘的基础上,提供了一个用来管理文件的树状结构。

1.1.1.索引节点和目录项

        在 Linux 中一切皆文件 ,文件系统,本身是对存储设备上的文件,进行组织管理的机制
        为了方便管理,Linux 文件系统为每个文件都分配两个数据结构, 索引节点(index node) 和 目录项(directory entry) 。它们主要用来记录文件的 元信息  目录结构 。

  • 索引节点,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。
  • 目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。

文件数据到底是怎么存储的呢?

        磁盘读写的最小单位是扇区,然而扇区只有 512B 大小,如果每次都读写这么小的单位,效率一定很低。所以,文件系统又把连续的扇区组成了逻辑块,然后每次都以逻辑块为最小单元,来管理数据。常见的逻辑块大小为 4KB,也就是由连续的 8 个扇区组成。

注意:

        1. 目录项本身就是一个内存缓存,而索引节点则是存储在磁盘中的数据 ,Buwer和Cache缓存可以协调慢速磁盘与快速 CPU 的性能差异,文件内容会缓存到页缓存 Cache 中 ,这些索引节点自然也会缓存到内存中,加速文件的访问。
        2. 磁盘在执行文件系统格式化时,会被分成三个存储区域, 超级块 、 索引节点区 和 数据块区 。

  • 超级块,存储整个文件系统的状态。
  • 索引节点区,用来存储索引节点。
  • 数据块区,则用来存储文件数据。


1.1.2.虚拟文件系统

什么是虚拟文件系统VFS?

        为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入了一个抽象层,也就是虚拟文件系统 VFS(Virtual File System)。VFS 定义了一组所有文件系统都支持的数据结构和标准接口。这样,用户进程和内核中的其他子系统,只需要跟 VFS 提供的统一接口进行交互就可以了,而不需要再关心底层各种文件系统的实现细节。

        为了更好地理解系统调用、VFS、缓存、文件系统以及块存储之间的关系 ,可以参考Linux 文件系统的架构图

Linux性能优化-磁盘I/O优化
Linux文件系统架构图

        通过这张图可以看到,在 VFS 的下方,Linux 支持各种各样的文件系统,如 Ext4、XFS、NFS 等等。按照存储位置的不同,这些文件系统可以分为三类。

  • 第一类是基于磁盘的文件系统,也就是把数据直接存储在计算机本地挂载的磁盘中。常见的 Ext4、XFS、OverlayFS等,都是这类文件系统。
  • 第二类是基于内存的文件系统,也就是我们常说的虚拟文件系统。这类文件系统,不需要任何磁盘分配存储空间,但会占用内存。我们经常用到的 /proc就是一种最常见的虚拟文件系统。
  • 第三类是网络文件系统,也就是用来访问其他计算机数据的文件系统,比如 NFS、SMB、iSCSI 等。

        这些文件系统,要先挂载到 VFS 目录树中的某个子目录(称为挂载点),然后才能访问其中的文件。拿第一类,也就是基于磁盘的文件系统为例,在安装系统时,要先挂载一个根目录(/),在根目录下再把其他文件系统(比如其他的磁盘分区、/proc 文件系统、/sys 文件系统、NFS 等)挂载进来。

2.磁盘I/O工作原理

2.1.磁盘类型

2.1.1.根据介质不同分类

磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘

        第一类,机械磁盘(Hard Disk Driver),也称为硬盘驱动器,通常缩写为 HDD。机械磁盘主要由盘片和读写磁头组成,数据就存储在盘片的环状磁道中。在读写数据前,需要移动读写磁头,定位到数据所在的磁道,然后才能访问数据。
        如果 I/O 请求刚好连续,那就不需要磁道寻址,自然可以获得最佳性能。这其实就是我们熟悉的,连续 I/O 的工作原理。与之相对应的,当然就是随机 I/O,它需要不停地移动磁头,来定位数据位置,所以读写速度就会比较慢。

        第二类,固态磁盘(Solid State Disk),通常缩写为 SSD,由固态电子元器件组成。固态磁盘不需要磁道寻址,所以,不管是连续 I/O,还是随机 I/O 的性能,都比机械磁盘要好得多。

        其实,无论机械磁盘,还是固态磁盘,相同磁盘的随机 I/O 都要比连续 I/O 慢很多,原因也很明显。

  • 对机械磁盘来说,我们刚刚提到过的,由于随机 I/O 需要更多的磁头寻道和盘片旋转,它的性能自然要比连续I/O 慢。
  • 而对固态磁盘来说,虽然它的随机性能比机械硬盘好很多,但同样存在“先擦除再写入”的限制。随机读写会导致大量的垃圾回收,所以相对应的,随机 I/O 的性能比起连续 I/O 来,也还是差了很多。
  • 此外,连续 I/O 还可以通过预读的方式,来减少 I/O 请求的次数,这也是其性能优异的一个原因。很多性能优化的方案,也都会从这个角度出发,来优化 I/O 性能。


机械磁盘和固态磁盘还分别有一个最小的读写单位。

  • 机械磁盘的最小读写单位是扇区,一般大小为 512 字节。
  • 而固态磁盘的最小读写单位是页,通常大小是 4KB、8KB 等。


2.1.2.磁盘按照接口分类

        按照接口来分类,比如可以把硬盘分为 IDE(Integrated Drive Electronics) 、 SCSI(Small Computer System Interface) 、 SAS(Serial Attached SCSI) 、 SATA(Serial ATA) 、 FC(Fibre Channel)等。

        不同的接口,往往分配不同的设备名称。比如, IDE 设备会分配一个 hd 前缀的设备名,SCSI 和 SATA 设备会分配一个 sd 前缀的设备名。如果是多块同类型的磁盘,就会按照 a、b、c 等的字母顺序来编号。

2.1.3.按照使用方式分类

        把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列,也就是 RAID(Redundant Array of Independent Disks),从而可以提高数据访问的性能,并且增强数据存储的可靠性。

        根据容量、性能和可靠性需求的不同,RAID 一般可以划分为多个级别,如 RAID0、RAID1、RAID5、RAID10 等。RAID0 有最优的读写性能,但不提供数据冗余的功能。

        而其他级别的 RAID,在提供数据冗余的基础上,对读写性能也有一定程度的优化。

        最后一种架构,是把这些磁盘组合成一个网络存储集群,再通过 NFS、SMB、iSCSI 等网络存储协议,暴露给服务器使用。

        在 Linux 中,磁盘实际上是作为一个块设备来管理的,也就是以块为单位读写数据,并且支持随机读写。每个块设备都会被赋予两个设备号,分别是主、次设备号。主设备号用在驱动程序中,用来区分设备类型;而次设备号则是用来给多个同类设备编号。

2.2.IO栈 

Linux的IO路径可能是Linux系统中比较复杂的模块,它直接决定了系统的性能。

Linux性能优化-磁盘I/O优化
Linux 存储系统的 I/O 栈全景图

根据这张 I/O 栈的全景图,我们可以更清楚地理解,存储系统 I/O 的工作原理。

应用程序:

        通过相关系统调用(如open/read/write)发起IO请求,属于IO请求的源头;

文件系统:

        应用程序的请求直接到达文件系统层。文件系统又分为VFS和具体文件系统(ext3、ext4等),VFS对应用层提供统一的访问接口,而ext3等文件系统则实现了这些接口。另外,提高IO性能,在该层还实现了诸如page cache等功能。同时,用户也可以选择绕过page cache,而是直接使用direct模式进行IO(如数据库)。

块设备层:

        文件系统将IO请求打包提交给块设备层,该层会对这些IO请求作合并、排序、调度等,然后以新的格式发往更底层。在该层次上实现了多种电梯调度算法,如cfq、deadline等。

SCSI层:

        块设备层将请求发往SCSI层,SCSI就开始真实处理这些IO请求,但是SCSI层又对其内部按照功能划分了不同层次: * SCSI高层:高层驱动负责管理disk,接收块设备层发出的IO请求,打包成SCSI层可识别的命令格式,继续往下发; *SCSI中层:中层负责通用功能,如错误处理,超时重试等; * SCSI低层:底层负责识别物理设备,将其抽象提供给高层,同时接收高层派发的scsi命令,交给物理设备处理。

3.性能指标

3.1.磁盘I/O性能指标

        我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能。磁盘 I/O 性能监控的指标主要包括:

1).每秒 I/O 数( IOPS )
        一次磁盘的连续读或者连续写称为一次磁盘 I/O, 磁盘的 IOPS 就是每秒磁盘连续读次数和连续写次数之和。

2).吞吐量( Throughput)
        指硬盘传输数据流的速度,传输数据为读出数据和写入数据的和。

3).平均 I/O 数据尺寸
        平均 I/O 数据尺寸为吞吐量除以 I/O 数目,该指标对揭示磁盘使用模式有重要意义。

4).磁盘活动时间百分比( Utilization) %util
        磁盘处于活动时间的百分比,即磁盘利用率,磁盘在数据传输和处理命令处于活动状态。

5).服务时间( ServiceTime) svctm
        指磁盘读或写操作执行的时间,包括寻道,数据传输等时间。

6).I/O 等待队列长度( Queue Length)
        指待处理的 I/O 请求的数目,如果 I/O 请求压力持续超出磁盘处理能力,该值将增加。 

7).等待时间( Wait Time)
        指磁盘读或写操作等待执行的时间,即在队列中排队的时间。

3.2.磁盘I/O观测 

iostat 是最常用的磁盘 I/O 性能观测工具,它提供了每个磁盘的 使用率 、 IOPS 、 吞吐量 等各种常见的性能指标,当然,这些指标实际上来自 /proc/diskstats。

1.命令格式:iostat [参数][时间][次数]
2.常用参数:

  1. -c : 仅显示 cpu的状态
  2. -d : 显示磁盘使用情况,不可以和 -c一起使用
  3. -k : 默认显示的是读入读出的 block信息,以 KB 为单位显示
  4. -m : 以 M 为单位显示
  5. -t : 显示终端和CPU的信息
  6. -x : 显示详细信息

3.显示所有磁盘I/O的指标 

Linux性能优化-磁盘I/O优化

4.磁盘每一列的含义如下:

参数 含义 说明
r/s 每秒发送给磁盘的读请求数 合并后的请求数
w/s 每秒发送给磁盘的写请求数 合并后的请求数
rkB/s 每秒从磁盘读取的数据量 单位为KB
wkB/s 每秒向磁盘写入的数据量 单位为KB
rrqm/s 每秒合并的读请求数 %rrqm标识合并读请求的百分比
wrqm/s 每秒合并的写请求数 %wrqm标识合并写请求的百分比
r_await 读请求处理完毕等待时间 包括队列中的等待时间和
设备实际处理时间,单位毫秒
w_await 写请求处理完成等待时间 包括队列中的等待时间和
设备实际处理时间,单位毫秒
aqu-sz 平均请求队列长度 旧版为avgqu-sz
rareq-sz 平均读请求大小 单位为KB
wareq-sz 平均写请求大小 单位为KB
svctm 处理I/O请求所需要的平均时间(不包含等待时间) 单位为毫秒。
%util 磁盘处理I/O的时间百分比 使用率,由于可能存在并行I/O 100%
并不一定代表磁盘I/O饱和

5.需要注意的指标

  • %util ,就是我们前面提到的磁盘 I/O 使用率;
  • r/s+ w/s ,就是 IOPS;
  • rkB/s+wkB/s ,就是吞吐量;
  • r_await+w_await ,就是响应时间。
  • iostat 并不能直接得到磁盘饱和度。可以把观测到的,平均请求队列长度或者读写请求完成的等待时间,跟基准测试的结果进行对比,综合评估磁盘的饱和情况。

3.3.进程I/O观测

要观察进程的 I/O 情况,还可以使用 pidstat 和 iotop 这两个工具。

3.3.1.pidstat 观测I/O

        pidstat 给它加上 -d 参数(使用-d选项,可以查看进程IO的统计信息 ),就可以看到进程的 I/O 情况,如下所示:

$ pidstat -d 1
13:39:51 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
13:39:52 102 916 0.00    4.00    0.00      0       rsyslogd

从 pidstat 的输出能看到,它可以实时查看每个进程的 I/O 情况,包括下面这些内容。

  • 用户 ID(UID)和进程 ID(PID) 。
  • 每秒读取的数据大小(kB_rd/s) ,单位是 KB。
  • 每秒发出的写请求数据大小(kB_wr/s) ,单位是 KB。
  • 每秒取消的写请求数据大小(kB_ccwr/s) ,单位是 KB。
  • 块 I/O 延迟(iodelay),包括等待同步块 I/O 和换入块 I/O 结束的时间,单位是时钟周期。

3.3.2.iotop 观测I/O

        iotop是一个类似于 top 的工具,可以按照 I/O 大小对进程排序,然后找到 I/O 较大的那些进程。如果没有该命令,请通过 yum install iotop 进行安装

Linux性能优化-磁盘I/O优化

        从这个输出可以看到,前两行分别表示,进程的磁盘读写大小总数和磁盘真实的读写大小总数。因为缓存、缓冲区、I/O 合并等因素的影响,它们可能并不相等。

        剩下的部分,则是从各个角度来分别表示进程的 I/O 情况,包括线程 ID、I/O 优先级、每秒读磁盘的大小、每秒写磁盘的大小、换入和等待 I/O 的时钟百分比等。

4.性能工具

        第一个维度,从文件系统和磁盘 I/O 的性能指标出发。换句话说,当你想查看某个性能指标时,要清楚知道,哪些工具可以做到 

性能指标 工具 说明
文件系统空间容量
使用量及剩余空间
df 详细文档参考
info coreutils 'df invocation'
索引节点容量
使用量及剩余量
df 使用-i选项
页缓存和可回收slab缓存 /proc/meminfo
sar
vmstat
使用sar -r选项
缓冲区 /proc/meminfo
sar
vmstat
使用sar -r选项
目录项、索引节点及文件系统的缓存 /proc/slabinfo
slabtop
slabtop更直观
磁盘I/O使用率、IOPS、吞吐量、响应时间
I/O平均大小及等待队列长度
iostat
sar
dstat
使用 iostat -d -x或 sar -d选项
进程I/O大小及IO延迟 pidstat
iotop
使用pidstat -d选项

        第二个维度,从工具出发。也就是当你已经安装了某个工具后,要知道这个工具能提供哪些指标。

根据工具查询指标

性能工具 性能指标
iostat 磁盘I/O使用率、IOPS、吞吐量、
响应时间、I/O平均大小及等待队列长度
pidstat 进程I/O大小及I/O延迟
sar 磁盘I/O使用率、IOPS、吞吐量及响应时间
dstat 磁盘I/O使用率、IOPS及吞吐量
iotop 按I/O大小对进程排序
slabtop 目录项、索引节点及文件系统的缓存
/proc/slabinfo 目录项、索引节点及文件系统的缓存
/proc/meminfo 页缓存和可回收Slab缓存
/proc/diskstats 磁盘的IOPS、吞吐量及延迟
/proc/pid/io 进程IOPS、I/O大小及I/O延迟
vmstat 缓存和缓冲区用量
biotop 跟踪进程块I/O并按照I/O大小排序
strace 跟踪进程的I/O系统调用
perf 跟踪内核的I/O事件
df 磁盘空间和索引节点使用量和剩余量
mount 文件系统的挂载路径及挂载参数
du 显示目录或文件的大小

5.磁盘I/O优化策略

5.1.应用程序优化策略

  1. 可以用追加写代替随机写,减少寻址开销,加快 I/O 写的速度。
  2. 可以借助缓存 I/O ,充分利用系统缓存,降低实际 I/O 的次数。
  3. 可以在应用程序内部构建自己的缓存,或者用 Redis 这类外部缓存系统。
  4. 需要频繁读写同一块磁盘空间时,可以用 mmap 代替 read/write,减少内存的拷贝次              数。
  5. 在需要同步写的场景中,尽量将写请求合并,而不是让每个请求都同步写入磁盘。
  6. 在多个应用程序共享相同磁盘时,为了保证 I/O 不被某个应用完全占用,推荐你使                  用 cgroups 的 I/O 子系统,来限制进程 / 进程组的 IOPS 以及吞吐量。

5.2.文件系统优化策略

  1. 可以根据实际负载场景的不同,选择最适合的文件系统。比如 Ubuntu 默认使用 ext4 文件系统,而CentOS 7 默认使用 xfs 文件系统。
  2. 在选好文件系统后,还可以进一步优化文件系统的配置选项 。
  3. 可以优化文件系统的缓存 。

5.3.磁盘优化策略

磁盘也是整个 I/O 栈的最底层。从磁盘角度出发,自然也有很多有效的性能优化方法文章来源地址https://www.toymoban.com/news/detail-422315.html

  1. 最简单有效的优化方法,就是换用性能更好的磁盘,比如用 SSD 替代 HDD。
  2. 我们可以使用 RAID ,把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列。这样既可以提高数据的可靠性,又可以提升数据的访问性能。
  3. 针对磁盘和应用程序 I/O 模式的特征,我们可以选择最适合的 I/O 调度算法。比方说,SSD 和虚拟机中的磁盘,通常用的是 noop 调度算法。而数据库应用,我更推荐使用 deadline 算法。
  4. 我们可以对应用程序的数据,进行磁盘级别的隔离 。
  5. 在顺序读比较多的场景中,我们可以增大磁盘的预读数据 。
  6. 我们可以优化内核块设备 I/O 的选项。比如,可以调整磁盘队列的长度,以提升磁盘的吞吐量 。

到了这里,关于Linux性能优化-磁盘I/O优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux中系统性能监测命令sar,查看cpu、内存、磁盘、网络等使用情况

    显示系统CPU利用率的统计信息: -u : 这是sar命令的选项之一,表示要显示CPU利用率相关的统计数据。 1 : 这是指定采样间隔的参数,表示每秒采样一次数据。 5 : 这是指定采样次数的参数,表示总共采样5次数据。 %user:用户模式下消耗的 CPU 时间的比例。 %nice:通过 nice 改变了

    2024年02月08日
    浏览(41)
  • Linux文件系列:磁盘,文件系统,软硬链接

    我们之前所学的都是被进程打开了的文件,接下来我们要学习没有被进程所打开的文件,它们是存储在磁盘当中的 要学习这些文件,首先我们要先学习一下磁盘 1.LBA地址 我们知道磁带在展开之后呈现一种带状结构,磁带中的数据就是以这种线性的方式进行存储的 那么我们可不可以

    2024年03月27日
    浏览(38)
  • 如何解决ubuntun虚拟机报错“如果该文件位于远程文件系统上,请确保网络连接以及该磁盘所在服务器正常工作..........”

    一.问题描述 昨天晚上本人虚拟机在跑数据的时候突然卡顿了,然后重启,重启不开,居然直接报错(如下图),本来兴致勃勃这种问题已经出现了不知道n次了,直接删除安装目录中的lck文件文件就OK了,这次直接没用了,我当然就奔溃了,我擦,我那么多数据呢都没转移到

    2024年04月15日
    浏览(81)
  • Linux性能优化--性能工具:系统内存

    本章概述了系统级的Linux内存性能工具。本章将讨论这些工具可以测量的内存统计信息,以及如何使用各种工具收集这些统计结果。阅读本章后,你将能够: 理解系统级性能的基本指标,包括内存的使用情况。 明白哪些工具可以检索这些系统级性能指标。 每一种系统级Linu

    2024年02月07日
    浏览(28)
  • Linux 文件系统 fsck 磁盘修复

      Linux 文件系统是一种管理存储设备上所存储的文件的一种内生性软件。Linux 支持多种类型的文件系统,以便在硬盘中存储应用程序、数据文件和配置文件等。   文件系统类型:Linux 支持多种文件系统,例如 ext4、xfs、btrfs 等。每种文件系统都在存储设备上实现了虚拟目

    2024年04月13日
    浏览(25)
  • linux磁盘分区与文件系统挂载

    硬盘的类型: IDE接口 hda(表示第一块硬盘) hdb (第二块硬盘) … (hd表示硬盘) hda1(第一个硬盘的第一个分盘/分区) hda2(第二个分盘) hda3 … SATA接口 SCSI接口 USB (sd表示接口) sda(第一块硬盘) sdb(第二块硬盘) sda1(第一个分盘) sda2(第二个分盘) sda3 … sdb1(

    2024年02月02日
    浏览(41)
  • 【Linux】磁盘结构 | 文件系统 | 软硬链接

    文件的状态有被打开和没有被打开,之前谈到一个文件被进行读写,就要打开加载到内存中,通过对应的系统调用,fd文件描述符的管理,write和read等函数的增删查改。并且借助缓冲区对文件属性和内容的修改。 大部分文件是没有被打开的(不需要访问),都在磁盘里保存的

    2024年01月20日
    浏览(29)
  • Linux 系统性能优化

    一、影响 Linux 性能的各种因素 1、系统硬件资源 (1)CPU 如何判断多核 CPU 与超线程 消耗 CPU 的业务:动态 web 服务、mail 服务 (2)内存 物理内存与 swap 的取舍 选择 64 位 Linux 操作系统 消耗内存的业务:内存数据库(redis/hbase/mongodb) (3)磁盘 IO RAID 技术(RAID0/1/5/01/10)

    2024年02月12日
    浏览(35)
  • Linux云计算——磁盘和文件系统管理(二)

    作者简介:一名云计算网络运维人员、每天分享云计算运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录  前言 一.LVM 概述  1.LVM:(Logical Volume Manager)逻辑卷管理 ①需要注意: ②图形界面管理工具 2.LVM 机制的基本概念  ①LVM的

    2023年04月13日
    浏览(20)
  • Linux云计算—— 磁盘和文件系统管理(一)

    作者简介:一名云计算网络运维人员、每天分享云计算运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录  前言 一.管理磁盘及分区 1.检测并确认新硬盘 (1)fdisk介绍 (2)fdisk命令 (3)查看或管理磁盘分区:fdisk  -l  二.管理

    2023年04月15日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包