高性能 Go 语言发行版优化与落地实践 (Go 内存管理及优化、编译器优化)

本文是记录2022年5月字节跳动青训营的课程笔记!!!

本文内容:

                优化:

                        内存管理优化

                        编译器优化

                背景:

                        自动内存管理和Go内存管理机制

                        编译器优化的基本问题和思路

                实践:

                        字节跳动遇到的性能问题和优化方案

性能优化:

性能优化是什么:

        提升软件能力,减少不必要的消耗,充分发掘计算机的能力

为什么要做性能优化:

        用户体验:带来用户体验的提升

        资源高效利用:降低成本、提高效率

1.自动内存管理

1.1背景及概念

动态内存:

程序在运行时根据需求动态分配的内存

自动内存管理:

由程序语言的运行时系统管理动态内存

优点:

        避免手动内存管理,专注于实现业务逻辑

        保证内存使用的正确性和安全性

三个任务:

为新对象分配空间

找到存活对象

回收死亡对象的内存空间

Mutator:业务线程,分配新对象,修改对象的指向关系

Collector:GC线程,找到存活对象,回收死亡对象的内存空间

Serial GC:只有一个GC

ParallelGC:支持多个collectors同时回收GC的算法

Concurrent GC:mutator和collector可以同时执行 

注:Collectors必须感知对象指向关系的改变

评价GC算法:

                安全性:不能回收存活对象 基本要求

                吞吐率:1-GC时间/程序运行总时间 花在GC上的时间

                暂停时间:STW 业务是否感知

                内存开销:GC元数据开销

1.2追踪垃圾回收

对象被回收的条件:指针指向关系不可达的对象

标记根对象(静态变量、全局变量、常量、线程栈等)

标记:可达对象

求指针指向关系的传递闭包:从根对象出发,找到所有可达对象

清理:所有不可达对象

        将存活对象复制到另外的内存空间(Copying GC)

        将死亡对象的内存标记为“可分配”(Mark-sweep GC)

        移动并整理存活对象(Mark-compact GC)

根据对象的生命周期,使用不同的标记和清理策略

分代GC

Java JVM 类似

Java 虚拟机(JVM)学习笔记_芙蓉铁蛋的博客-CSDN博客

对年轻和老年代的对象,制定不同的GC策略,降低整体内存管理开销

不同年龄的对象处于heap的不同区域

年轻代:常规的对象分配,由于存活对象很少可以采用copying collection GC吞吐率高

老年代:对象趋向于一直活着,反复复制开销较大,可以采用mark-sweep collection

1.3引用计数

每一个对象都有一个与之关联的引用数目

对象存活条件:当且仅当引用数大于0

优点:内存管理的操作被平摊到程序执行过程中

           内存管理不需要了解runtime的实现细节:C++智能指针

缺点:维护引用计数的开销较大:通过原子操作保证对引用计数操作的原子性和可见性

           无法回收环形数据结构

           内存开销:每个对象都引入了额外的内存空间存储引用数目

           回收内存时依然可能引发暂停

环形数据结构:

2.Go内存管理及优化

2.1Go内存分配

分块

目标:为对象在heap上分配内存

提前将内存分块

        调用系统调用mmap()向OS申请一大块内存,例如4MB

        先将内存划分为大块,例如8KB,成为mspan

        再将大块继续分成特定大小的小块,用于对象分配

        noscan mspan:分配不包含指针的对象—GC不需要扫描

        scan mspan:分配包含指针的对象—GC需要扫描

对象分配:根据对象的大小,选择最合适的快返回

缓存

TCMalloc:thread caching

每个p包含一个mcache用于快速分配,用于绑定p上的g分配对象

mcache管理一组mspan

当mcache中的mspan分配完毕,向mcentral申请带有未分配块的mspan

当mspan中没有分配的对象,mspan会被缓存在mcentral中,而不是立刻释放归还给OS

2.2内存管理优化

对象分配是非常高频的操作:每秒分配GB级别的内存

小对象占比比较高

Go内存分配比较耗时

        分配路径长:g -> m -> p -> mcache -> mspan -> memory block -> return pointer

        pprof:对象分配的函数时最频繁调用的函数之一

字节跳动优化方案(Balanced GC):

每个g都绑定一大块内存(1KB),称做:goroutine allocation buffer(GAB)

GAB用于noscan类型的小对象分配:<128 B

使用三个指针维护GAB:base,end,top

Bump pointer(指针碰撞)风格对象分配

        无需和其他分配请求互斥

        分配动作简单高效

GAB对于Go内存管理来说是一个大对象

本质:将多个小对象的分配合并成一次大对象的分配

问题:GAB的对象分配方式会导致内存被延迟释放

从 Go runtime 内存管理模块的角度看,一个 allocation buffer 其实是一个大对象。本质上balanced GC 是将多次小对象的分配合并成一次大对象的分配。因此,当 GAB 中哪怕只有一个小对象存活时,Go runtime 也会认为整个大对象(即 GAB)存活。

当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中

原来的GAB可以释放,避免内存泄漏

本质:用copy GC 的算法管理小对象

为此,balanced GC 会根据 GC 策略,将 GAB 中存活的对象移动到另外的 GAB 中,从而压缩并清理 GAB 的内存空间,原先的 GAB 空间由于不再有存活对象,可以全部释放,如下图所示。

上图上方是两个 GAB,其中虚线表示 GAB 中对象的分界线。黑色表示 GAB 中存活的对象,白色表示死掉的对象。由于 GAB 中有存活对象,整个 GAB 无法被回收。

Balanced GC 会将 GAB 中存活的对象移动到下面的 GAB 中,这样原先的两个 GABs 就可以被释放,压缩并清理 GAB 的内存空间。

Balanced GC 只负责 noscan 对象的分配和移动,对象的标记和回收依然依赖 Go GC 本身,并和 Go GC 保持兼容。

3.编译器和静态分析

3.1编译器结构

他是一个重要的系统软件

        识别符合语法和非法的程序

        生成正确且高效的代码

分析部分(前端 front end)

        词法分析,生成语素

        语法分析,生成语法树

        语义分析,收集类型信息,进行语义检查

        中间代码生成,生成intermediate representation (IR)

 综合部份(后端 back end)

        代码优化,机器无关优化,生成优化后的IR

        代码生成,生成目标代码

3.2静态分析

静态分析:不执行代码,推导程序的行为,分析程序的性质

控制流(Control flow):程序执行的流程

数据流(Data flow):数据在控制流上的传递

通过分析控制流和数据流,我们可以知道更多关于程序的性质

根据这些性质优化代码

数据流: 

3.3过程内分析和过程间分析

Intra-procedural analysis: 过程内分析:在函数内进行控制流和数据流的分析

Inter-procedural analysis: 过程间分析:除了函数内的分析,还需要考虑跨函数的数据流和控制流,例如参数传递,函数返回值等

为什么过程间分析是个问题?

        需要通过数据流分析得知i的具体类型,才知道i.foo()调用的是哪个foo()

        根据 i 的具体类型,产生了新的控制流,i.foo(),分析继续

        过程间分析需要同时分析控制流和数据流—联合求解,比较复杂

4.Go编译器优化

目的

  • 用户无感知,重新编译即可获得性能收益
  • 通用的优化手段

现状

  • 采用的优化较少
  • 追求编译时间短,因此没有进行复杂的代码分析和优化

思路

  • 场景:面向后端长期执行的任务
  • Tradeoff:用适当增加编译时间换取更高性能的代码

字节跳动用适当的编译时间换取更高性能的机器码 

 4.1函数内联(Inlining)

定义:将被调用函数的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定

  • 优点

    • 消除调用开销
    • 将过程间分析的问题转换为过程内分析,帮助其他分析
  • 缺点

    • 函数体变大
    • 编译生成的 Go 镜像文件变大
  • 函数内联在大多数情况下是正向优化,即多内联,会提升性能
  • 采取一定的策略决定是否内联

    • 调用和被调用函数的规模

Beast Mode

  • Go 内联的限制

    • 语言特性:interface, defer 等等,限制了内联优化
    • 内联策略非常保守
  • 字节跳动的优化方案

    • 修改了内联策略,让更多函数被内联
    • 增加了其他优化的机会:逃逸分析
  • 开销

    • Go 镜像大小略有增加
    • 编译时间增加
    • 运行时栈扩展开销增加

4.2逃逸分析

  • 定义:分析代码中指针的动态作用域,即指针在何处可以被访问
  • 大致思路

    • 从对象分配处出发,沿着控制流,观察数据流。若发现指针 p 在当前作用域 s:

      • 作为参数传递给其他函数;
      • 传递给全局变量;
      • 传递给其他的 goroutine;
      • 传递给已逃逸的指针指向的对象;
    • 则指针 p 逃逸出 s,反之则没有逃逸出 s.

Beast mode :函数内联扩展了函数边界,更多对象不逃逸

  • 优化:未逃逸出当前函数的指针指向的对象可以在栈上分配

    • 对象在栈上分配和回收很快:移动 sp 即可完成内存的分配和回收;
    • 减少在堆上分配对象,降低 GC 负担。

参考阅读:

The Garbage Collection Handbook -- the art of automatic memory management

是自动内存管理领域的集大成之作。把自动内存管理的问题、动机、方案、以及最新研究进展和方向进行了非常详尽的阐述。整个书很好读,参考文献非常充实,推荐大家阅读英文版。

JEP 333: ZGC: A Scalable Low-Latency Garbage Collector openjdk.java.net/jeps/333

是目前 HotSpot JVM 上 pauseless GC 实现的 proposal,可以看作 GC 领域比较新的工程方面的进展。

数据密集型应用系统设计 Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems

通过例子带大家理解互联网产品需要解决的问题以及方案。

编译原理 The Dragon book, Compilers: Principles, Techniques, and Tools

在编译器前端着墨较多。本书第二版的第九章 机器无关优化,推荐大家反复仔细阅读。这一章主要讲述的是编译优化中常见的数据流分析问题,建议大家跟随书本仔细推导书中的例子,会帮助你对数据流分析有个大致的认识。这一章给出的引用文献大多是编译和静态分析领域非常有影响力的论文,有兴趣的同学可以阅读。

编译原理 Principles and Techniques of Compilers silverbullettt.bitbucket.io/courses/com…

南京大学编译原理课程。

静态程序分析 Static Program Analysis pascal-group.bitbucket.io/teaching.ht…

南京大学静态程序分析课程。参考文献 4 数据流分析读不懂的地方可以参考本课程的课件。

编译器设计 Engineering a Compiler

在编译器后端优化着墨较多。可以帮助大家理解后端优化的问题。

JVM Anatomy Quark #4: TLAB allocation shipilev.net/jvm/anatomy…

Goroutine allocation buffer (GAB) 的优化思路在 HotSopt JVM 也能找到类似的实现。

Constant folding, en.wikipedia.org/wiki/Consta…

常量折叠数据流分析。

Choi, Jong-Deok, et al. "Escape analysis for Java." Acm Sigplan Notices 34.10 (1999): 1-19.

逃逸分析的 Java 实现。

Zhao, Wenyu, Stephen M. Blackburn, and Kathryn S. McKinley. "Low-Latency, High-Throughput Garbage Collection." (PLDI 2022). 学术界和工业界在一直在致力于解决自动内存管理技术的不足之处,感兴趣的同学可以阅读。

裁道友不裁贫道
关注 关注
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
云原生之路 | 1.快速了解容器(Container)及容器编排技术
WeiyiGeek 唯一极客IT知识分享
09-18 922
2022年,原本是准备和同事一起完成出一本Kubernetes在企业落地实践的,但是由于老婆怀孕以及后来娃娃的出生需要照顾,从而错过了发版时间(工期赶不赢),后来一想是有点后悔,浪费了这一次宝贵机会,但是也无可奈何,出对主题大纲、籍目录、代码贴图、文章内容以及来源等格式都有严格的限制,所以说就是想赶上时间也是没办法的,不过在之前我已经完成了六章,如今生活一切都步入了正规,作者不详所以写和总结的文章吃灰,遂一一分享出来给大家一起学习,并且后续作者也会继续更新云原生在企业落地实践相关文章,在。
深入浅出区块链
GitChat
04-12 3895
内容简介 2017年,是区块链爆发又冷静的一年。 如果你持续关注过区块链技术,这一年可能已经对没完没了的概念介绍、前景描绘、行业探讨和链圈新闻产生了审美疲劳。没错,区块链必须与行业紧密结合,它也有颠覆人类协作方式之洪荒巨力,但是说到底它还是一个技术活,是要写代码的,在咖啡厅里整天坐而论道是造不出金链子来的。 本期我们梳理了2017年区块链发展现状,从关键技术原理与实际应用出发,带你深入浅出探索区块...
Go服务的内存优化内存管理
DongZhaoCheng
05-14 353
Go服务的内存优化内存管理 最近看了一个系列的博客,是我认为非常优秀的讲解Go内存管理以及操作系统内存管理的博客,谨以记录分享 主要讲解了操作系统的内存管理、并发与并行、逃逸分析、操作系统调度 高性能 Go 服务的内存优化(译) - 简 (jianshu.com) Go 语言调度(一): 系统调度 - 简 (jianshu.com) Go 语言调度(二): goroutine 调度器 - 简 (jianshu.com) Go 语言调度(三): 并发 - 简 (jianshu
GoLang之Go内存管理优化
weixin_52690231的博客
05-14 1582
GoLang之Go内存管理优化
GO内存支配&编译器优化
youcpdd的博客
01-19 292
1.Go内存管理—分块2.Go内存管理—缓存3.Go对象分配的性能问题
go 内存优化
weixin_33922672的博客
07-25 81
一、斐波那切数列优化 package main import ( "time" "fmt" ) const LIM = 41 var fibs [LIM]uint64 func main(){ var result uint64 = 0 start := time.Now() for i := 0; i < LIM; i++ { re...
Go 编译优化
海纳百川
09-14 1874
Go 编译优化 前言 减小编译后的二进制的体积,能够加快程序的发布和安装过程。 接下来我们将通过 go 编译选项和第三方工具学习如何减少编译后二进制的体积。 一、添加编译选项 Go 编译器默认编译出来的程序会带有符号表和调试信息,一般来说 release 版本可以去除调试信息以减小二进制体积: go build -ldflags="-s -w" -o main main.go 参数详解: -s: 忽略符号表和调试信息; -w: 忽略DWARFv3调试信息,使用该选项后将无法使用 gdb 进行调试。 二
国产化操作系统改造实践(未完)
企业实战系列集 ●●● https://ximenjianxue.blog.csdn.net
04-10 6257
而这些广泛使用的系统都是美国控制范围之内,停服之后,我国将面临产品中断、安全漏洞、运维困难、生态缺失等问题。为降低非自主可控OS对网络安全及供应链的影响,国家及中移集团要求各单位要积极推进CentOS、RedHat及其衍生版本以及SUSE操作系统迁移,提前准备其他品牌非国产操作系统的迁移;目标系统采用基于国内开源社区欧拉社区和龙蜥社区发布的版本。1)上传商业版BCLinux 8.6或社区版Anolis 8.6 镜像到目标主机。2)部署配置FTP服务。
一文带你彻底了解 Java 异步编程
weixin_70730532的博客
05-11 2438
随着RxJava、Reactor等异步框架的流行,异步编程受到了越来越多的关注,尤其是在 IO 密集型的业务场景中,相比传统的同步开发模式,异步编程的优势越来越明显。 那到底什么是异步编程?异步化真正的好处又是什么?如何选择适合自己团队的异步技术?在实施异步框架落地的过程中有哪些需要注意的地方? 本文从以下几个方面结合真实项目异步改造经验对异步编程进行分析,希望能给大家一些客观认识: 使用 RxJava 异步改造后的效果 什么是异步编程?异步实现原理 异步技术选..
区块链开发环境构建指南:以太坊私有链搭建与部署
# 1. 简介 ## 1.1 什么是区块链开发环境构建 区块链开发环境构建是指搭建一个用于开发和测试区块链应用程序的环境。...- 以太坊私有链可以提供更高的性能和较低的交易费用,方便开发和测试。 - 以太坊私有链可以定制
go语言最全优化技巧总结,值得收藏!
QcloudCommunity的博客
08-23 1069
导语|本文总结了在维护go基础库过程中,用到或者见到的一些性能优化技巧,现将一些理解梳理撰写成文,和大家探讨。一、常规手段(一)sync.Pool临时对象池应该是对可读性影响最小且优化...
Go 高性能编程技法
技术能量站
09-05 440
代码的稳健、可读和高效是我们每一个 coder 的共同追求。本文将结合 Go 语言特性,为写效率更高的代码,从常用数据结构、内存管理和并发,三个方面给出相关建议。话不多说,让我们一起学习 Go 高性能编程的技法吧。
go语言编译优化
q1454739828的博客
03-25 1173
go语言编译优化 go语言能够快速编译成二进制可执行文件,能够加速程序的发布和安装流程。下面我们将编译选项和第三方压缩工具两方面来介绍如何有效地减小 Go 语言编译后的体积。 下面我们写一个简单的测试工程来测试不同方式的效果 下面的程序启动一个RPC服务, package main import ( "log" "net/http" "net/rpc" ) // 编译优化 type Result struct { Num, Ans int } type Calc int func (calc
Go内存优化与垃圾收集
最新发布
残星说梦话
02-09 1476
你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。可以看到,当前堆的大小一直在增长,直到达到活跃堆大小的1000%。
字节跳动青训营Day04 - Go编译器优化
大河之犬的博客
05-14 663
将被调用函数的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定。
Go性能优化实践
qq_62215764的博客
01-19 915
本文主要介绍了Go语言性能优化,包括自动内存管理,Go内存管理编译器与静态分析,编译器优化,并对上述优化建议进行实践,包括Balanced GC优化对象分配,Beast Mode等。
Go语言的自动内存管理优化(字节跳动Balanced GC优化方案)(Day5)
m0_69631269的博客
01-20 535
自动内存管理概念介绍和Go语言的自动内存管理优化介绍(字节跳动Balanced GC优化方案)
go官方标准编译器中实现的优化锦集汇总-Go夜读
encircles的博客
12-17 421
感谢 Go夜读 感谢 Go101 优化1 紧跟 range 关键字的从字符串到字节切片的转换 package main import ( "strings" "testing" ) var gogogo = strings.Repeat("Go", 1024) func f() { for range []byte(gogogo) { } } func g() { bs := []byte(gogogo) for range bs { } } func TestT1(t *t.
深入理解JVM性能优化编译器解析与优化技巧
"Java虚拟机JVM性能优化的第二部分主要关注编译器,包括客户端编译器、服务器端编译器和多层编译的性能对比,以及JVM优化技术,如死代码消除、代码嵌入和循环体优化。" 在Java虚拟机(JVM)的世界里,编译器扮演着至...
写文章

热门文章

  • 仿牛客网讨论社区项目—项目总结及项目常见面试题 25410
  • 从零开始—仿牛客网讨论社区项目(一) 17314
  • 从零开始—仿牛客网讨论社区项目(二) 6801
  • 从零开始—仿牛客网讨论社区项目(四) 6257
  • 从零开始—仿牛客网讨论社区项目(六) 5599

最新评论

  • 从零开始—仿牛客网讨论社区项目(六)

    chaofengdev: 我现在才明白这种记录有多可贵,我去年做的项目,现在已经完全忘记了。代码虽然是一行一行跟着敲的,但是现在启动都不会启动了。如果我当时写了一个文档,现在也不至于一筹莫展。

  • 仿牛客网讨论社区项目—项目总结及项目常见面试题

    莺啼山客犹眠: 请问怎么把它搞成前后端分离的呢,比如面试时我说前端是用的vue

  • 从零开始—仿牛客网讨论社区项目(六)

    chaofengdev: 少了第三节“权限控制”。

  • 从零开始—仿牛客网讨论社区项目(四)

    chaofengdev: message-mapper笔误写成了 meaage-mapper。

  • 从零开始—仿牛客网讨论社区项目(四)

    chaofengdev: 真不错,刚开始还需要看看,现在做到这里,直接跟着视频敲就行。不过这个复习还是很好用的,可以梳理一下开发思路。另外,如果时间不够的话,也可以直接用这个和视频快速过一遍,假装自己做了一遍。总之感谢答主的付出~ love&peace

最新文章

  • Redis知识总结(常见面试题分享)
  • fresco框架初始化、加载、缓存分析(常规的缓存设置策略)
  • Android开发—OkHttp&Retrofit
2023年1篇
2022年21篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裁道友不裁贫道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家商场门头糖果美陈玻璃钢小黄人卡通雕塑江苏主题商场美陈销售公司玻璃钢奶茶杯雕塑招财山东户外玻璃钢雕塑销售电话郑成功玻璃钢人物雕塑亳州仿铜玻璃钢雕塑定制商场活动美陈策划方案南昌商场美陈费用好口碑的玻璃钢雕塑玻璃钢雕塑印花太原水果玻璃钢雕塑定做价格成都树脂玻璃钢雕塑饰品广安玻璃钢仿铜雕塑定制福建玻璃钢雕塑工厂店舟山玻璃钢卡通雕塑价格商场产品美陈个性化玻璃钢雕塑定制杭州玻璃钢金属雕塑介绍云南定做玻璃钢雕塑厂家哪家专业玻璃钢卡通雕塑加盟定制玻璃钢雕塑生产厂家沈阳玻璃钢浮雕雕塑厂苏州通用玻璃钢花盆南城玻璃钢雕塑硅胶蜡像北京玻璃钢雕塑灯价格南岸玻璃钢人物雕塑玻璃钢雕塑用法上海佛像玻璃钢雕塑优势手糊玻璃钢雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化