皇冠现金
iba真人百家乐博彩入口_为什么 Go 占用那么多的捏造内存?
你的位置:| 皇冠现金 > 皇冠网址 > iba真人百家乐博彩入口_为什么 Go 占用那么多的捏造内存?

iba真人百家乐博彩入口_为什么 Go 占用那么多的捏造内存?

发布日期:2023-10-30 08:10    点击次数:139

iba真人百家乐博彩入口_为什么 Go 占用那么多的捏造内存?

iba真人百家乐博彩入口_

 澳门在线[[349727]]澳门在线

本文转载自微信公众号「脑子进煎鱼了」,作家陈煎鱼。转载本文请磋磨脑子进煎鱼了公众号。 

前段时候,某同学说某职业的容器因为超出内存已毕,不停地重启,问咱们是不是有内存裸露,迅速排查,然后处分掉,省的出问题。

咱们大为恐慌,迅速搜检监控+报警系统和性能分析,发现应用主张根底就不高,不像有裸露的神志。

问题到底是出在那处了呢,咱们干与某个容器里搜检了 top 的系统主张:

PID       VSZ    RSS   ... COMMAND 67459     2007m  136m  ... ./eddycjy-server 

看上去也没什么大支出的东西,就一个 Go 进度?就这?

再定眼一看,某同学就说 VSZ 那么高,而某云上的容器内存主张果然正好和 VSZ 的值相接近,因此就怀疑是不是 VSZ 所导致的,认为存在一定的关联关连。

这个谋划的效率到底是否正确呢?

基础常识

本篇著作将主要围绕 Go 进度的 VSZ 来进行领会,望望到底它为什么那么 "高"。

第一节为前置的补充常识,寰宇可按规章阅读。

什么是 VSZ

VSZ 是该进度所能使用的捏造内存总大小,它包括进度不错拜访的扫数内存,其中包括了被换出的内存(Swap)、已分派但未使用的内存以及来自分享库的内存。

为什么要捏造内存

在前边咱们有了解到 VSZ 其实即是该进度的捏造内存总大小,那如果咱们想了解 VSZ 的话,那咱们得先了解 “为什么要捏造内存?”。

骨子上来讲,在一个系统中的进度是与其他进度分享 CPU 和主存资源的。

因此在当代的操作系统中,多进度的使用尽头的常见,如果太多的进度需要太多的内存,在莫得捏造内存的情况下,物理内存很可能会不够用,就会导致其中有些任务无法运行,更以至会出现一些很奇怪的气候。

举例 “某一个进度不小心写了另一个进度使用的内存”,就会酿成内存唠叨,因此捏造内存瑕瑜常进攻的一个弁言。

捏造内存包含了什么

捏造内存,又分为:

内核捏造内存。 进度捏造内存。

每一个进度的捏造内存都是寥寂的, 里面结构如下图所示。

体彩排列三直选号码318历史上出现了10次,其下期分别开出奖号:640、668、102、864、075、810、068、689、531,统计如下表:

皇冠hg86a

在内核捏造内存中,包含了内核中的代码和数据结构。

内核捏造内存中的某些区域会被映射到扫数进度分享的物理页面中去,因此你会看到 ”内核捏造内存“ 中履行上是包含了 ”物理内存“ 的,它们两者存在映射关连。

而从应用场景上来讲,每个进度也会去分享内核的代码和全局数据结构,因此就会被映射到扫数进度的物理页面中去。

捏造内存的进攻智力

为了更有用地管制内存况且减少出错,当代系统提供了一种对主存的概括主见,也即是今天的主角,叫作念捏造内存(VM)。

捏造内存是硬件特殊、硬件地址翻译、主存、磁盘文献和内核软件交互的场地,它为每个进度提供了一个大的、一致的和特殊的地址空间,捏造内存提供了三个进攻的智力:

它将主存四肢是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存举止区域,并字据需要在磁盘和主存之间来去传送数据,通过这种花样,它高效地使用了主存。

它为每个进度提供了一致的地址空间,从而简化了内存管制。

它保护了每个进度的地址空间不被其他进度唠叨。

新葡金网站

小结

上头发散的可能比拟多,肤浅来讲,关于本文咱们重心护理这些常识点,如下:

捏造内存它是有种种各样内存交互的场地,它包含的不单是是 "我方",而在本文中,咱们只需要护理 VSZ,也即是进度捏造内存,它包含了你的代码、数据、堆、栈段和分享库。 捏造内存作为内存保护的用具,轻率保证进度之间的内存空间寥寂,不受其他进度的影响,因此每一个进度的 VSZ 大小都不不异,互不影响。 捏造内存的存在,系统给各进度分派的内存之和是不错大于履行可用的物理内存的,因此你也会发现你进度的物理内存老是比捏造内存低的多的多。

排查问题

在了解了基础常识后,咱们阐发脱手排查问题,第一步咱们先编写一个测试法子,望望莫得什么业务逻辑的 Go 法子,它开动的 VSZ 是如何样的。

测试

应用代码:

func main() {  r := gin.Default()  r.GET("/ping", func(c *gin.Context) {   c.JSON(200, gin.H{    "message": "pong",   })  })  r.Run(":8001") } 

搜检进度情况:

$ ps aux 67459 USER      PID  %CPU %MEM      VSZ    RSS   ... eddycjy 67459   0.0  0.0  4297048    960   ... 

从效率上来看,VSZ 为 4297048K,也即是 4G 傍边,咋一眼看往日如故挺吓东谈主的,明明莫得什么业务逻辑,关联词为什么那么高呢,竟然令东谈主感到敬爱。

感恩

证实有莫得裸露

金沙厅包厢最低消费

在未知的情况下,咱们不错最初看下 runtime.MemStats 和 pprof,细目应用到底有莫得裸露。不外咱们这块是演示法子,什么业务逻辑都莫得,因此不错细目和应用莫得平直关连。

皇冠模拟盘口
# runtime.MemStats # Alloc = 1298568 # TotalAlloc = 1298568 # Sys = 71893240 # Lookups = 0 # Mallocs = 10013 # Frees = 834 # HeapAlloc = 1298568 # HeapSys = 66551808 # HeapIdle = 64012288 # HeapInuse = 2539520 # HeapReleased = 64012288 # HeapObjects = 9179 ... 

Go FAQ

接着我第一反馈是去翻了 Go FAQ(因为看到过,有印象),其问题为 "Why does my Go process use so much virtual memory?",回报如下:

The Go memory allocator reserves a large region of virtual memory as an arena for allocations. This virtual memory is local to the specific Go process; the reservation does not deprive other processes of memory.

To find the amount of actual memory allocated to a Go process, use the Unix top command and consult the RES (Linux) or RSIZE (macOS) columns.

这个 FAQ 是在 2012 年 10 月 提交 的,这样多年了也莫得更进一步的诠释,再翻了 issues 和 forum,一些关闭掉的 issue 都指向了 FAQ,这昭着无法兴隆我的修业欲,因此我赓续往下探索,望望里面到底都摆了些什么。

搜检内存映射

在上图中,咱们有提到进度捏造内存,主要包含了你的代码、数据、堆、栈段和分享库,那初步怀疑是不是进度作念了什么内存映射,导致了多数的内存空间被保留呢,为了细目这少许,咱们通过如下号令去排查:

$ vmmap --wide 67459 ... ==== Non-writable regions for process 67459 REGION TYPE                      START - END             [ VSIZE  RSDNT  DIRTY   SWAP] PRT/MAX SHRMOD PURGE    REGION DETAIL __TEXT                 00000001065ff000-000000010667b000 [  496K   492K     0K     0K] r-x/rwx SM=COW          /bin/zsh __LINKEDIT             0000000106687000-0000000106699000 [   72K    44K     0K     0K] r--/rwx SM=COW          /bin/zsh MALLOC metadata        000000010669b000-000000010669c000 [    4K     4K     4K     0K] r--/rwx SM=COW          DefaultMallocZone_0x10669b000 zone structure ... __TEXT                 00007fff76c31000-00007fff76c5f000 [  184K   168K     0K     0K] r-x/r-x SM=COW          /usr/lib/system/libxpc.dylib __LINKEDIT             00007fffe7232000-00007ffff32cb000 [192.6M  17.4M     0K     0K] r--/r-- SM=COW          dyld shared cache combined __LINKEDIT ...          ==== Writable regions for process 67459 REGION TYPE                      START - END             [ VSIZE  RSDNT  DIRTY   SWAP] PRT/MAX SHRMOD PURGE    REGION DETAIL __DATA                 000000010667b000-0000000106682000 [   28K    28K    28K     0K] rw-/rwx SM=COW          /bin/zsh ...    __DATA                 0000000106716000-000000010671e000 [   32K    28K    28K     4K] rw-/rwx SM=COW          /usr/lib/zsh/5.3/zsh/zle.so __DATA                 000000010671e000-000000010671f000 [    4K     4K     4K     0K] rw-/rwx SM=COW          /usr/lib/zsh/5.3/zsh/zle.so __DATA                 0000000106745000-0000000106747000 [    8K     8K     8K     0K] rw-/rwx SM=COW          /usr/lib/zsh/5.3/zsh/complete.so __DATA                 000000010675a000-000000010675b000 [    4K     4K     4K     0K] rw- ... 

这块主要是期骗 macOS 的 vmmap 号令去搜检内存映射情况,这样就不错知谈这个进度的内存映射情况,从输出分析来看,这些关联分享库占用的空间并不大,导致 VSZ 过高的根本原因不在分享库和二进制文献上,关联词并莫得发现多数保留内存空间的举止,这是一个问题点。

注:如果 Linux 系统,可使用 cat /proc/PID/maps 或 cat /proc/PID/smaps 搜检。

搜检系统调用

既然在内存映掷中,咱们莫得明确的看到保留内存空间的举止,那咱们接下来望望该进度的系统调用,细目一下它是否存在内存操作的举止,如下:

$ sudo dtruss -a ./awesomeProject ...  4374/0x206a2:     15620       6      3 mprotect(0x1BC4000, 0x1000, 0x0)   = 0 0 ...  4374/0x206a2:     15781       9      4 sysctl([CTL_HW, 3, 0, 0, 0, 0] (2), 0x7FFEEFBFFA64, 0x7FFEEFBFFA68, 0x0, 0x0)   = 0 0  4374/0x206a2:     15783       3      1 sysctl([CTL_HW, 7, 0, 0, 0, 0] (2), 0x7FFEEFBFFA64, 0x7FFEEFBFFA68, 0x0, 0x0)   = 0 0  4374/0x206a2:     15899       7      2 mmap(0x0, 0x40000, 0x3, 0x1002, 0xFFFFFFFFFFFFFFFF, 0x0)   = 0x4000000 0  4374/0x206a2:     15930       3      1 mmap(0xC000000000, 0x4000000, 0x0, 0x1002, 0xFFFFFFFFFFFFFFFF, 0x0)   = 0xC000000000 0  4374/0x206a2:     15934       4      2 mmap(0xC000000000, 0x4000000, 0x3, 0x1012, 0xFFFFFFFFFFFFFFFF, 0x0)   = 0xC000000000 0  4374/0x206a2:     15936       2      0 mmap(0x0, 0x2000000, 0x3, 0x1002, 0xFFFFFFFFFFFFFFFF, 0x0)   = 0x59B7000 0  4374/0x206a2:     15942       2      0 mmap(0x0, 0x210800, 0x3, 0x1002, 0xFFFFFFFFFFFFFFFF, 0x0)   = 0x4040000 0  4374/0x206a2:     15947       2      0 mmap(0x0, 0x10000, 0x3, 0x1002, 0xFFFFFFFFFFFFFFFF, 0x0)   = 0x1BD0000 0  4374/0x206a2:     15993       3      0 madvise(0xC000000000, 0x2000, 0x8)   = 0 0  4374/0x206a2:     16004       2      0 mmap(0x0, 0x10000, 0x3, 0x1002,皇冠赌球 0xFFFFFFFFFFFFFFFF, 0x0)   = 0x1BE0000 0 ... 

在这末节中,咱们通过 macOS 的 dtruss 号令监听并搜检了运行这个法子所进行的扫数系统调用,发现了与内存管制有一定关连的方法如下:

mmap:创建一个新的捏造内存区域,但这里需要注重,即是当系统调用 mmap 时,它只是从捏造内存中苦求了一段空间出来,并不会去分派和映射确切的物理内存,而当你拜访这段空间的时候,才会在刻下时候信得过的去分派物理内存。那么对应到咱们履行应用的进度中,那即是 VSZ 的增长后,而该内存空间又未阐发使用的话,物理内存是不会有增长的。 madvise:提供磋磨使用内存的提议,举例:MADV_NORMAL、MADV_RANDOM、MADV_SEQUENTIAL、MADV_WILLNEED、MADV_DONTNEED 等等。 mprotect:建筑内存区域的保护情况,举例:PROT_NONE、PROT_READ、PROT_WRITE、PROT_EXEC、PROT_SEM、PROT_SAO、PROT_GROWSUP、PROT_GROWSDOWN 等等。 sysctl:在内核运行时动态地修改内核的运行参数。

在此比拟可疑的是 mmap 方法,它在 dtruss 的最终统计中一共调用了 10 余次,咱们不错信赖它在 Go Runtime 的时候进行了多数的捏造内存苦求。

咱们再接着往下看,望望到底是在什么阶段进行了捏造内存空间的苦求。

注:如果 Linux 系统,可使用 strace 号令。

搜检 Go Runtime

2023欧洲杯期间,XXX所在一直表现出色,成为赛场一匹黑马。据说做好周密准备,所有人感到惊艳。来体验一下运气,皇冠博彩网站上下一注赌注,结果居然中。感觉这场胜利不仅仅属于,属于所有支持。

启动经过

通过上述的分析,咱们不错知谈在 Go 法子启动的时候 VSZ 就如故不低了,况且细目不是分享库等的原因,且法子在启动时系统调用如实存在 mmap 等方法的调用。

那么咱们不错充分怀疑 Go 在开动化阶段就保留了该内存空间。那咱们第一步要作念的即是搜检一下 Go 的带领启动经过,望望是在那处苦求的。

带领过程如下:

graph TD A(rt0_darwin_amd64.s:8<br/>_rt0_amd64_darwin) -->|JMP| B(asm_amd64.s:15<br/>_rt0_amd64) B --> |JMP|C(asm_amd64.s:87<br/>runtime-rt0_go) C --> D(runtime1.go:60<br/>runtime-args) D --> E(os_darwin.go:50<br/>runtime-osinit) E --> F(proc.go:472<br/>runtime-schedinit) F --> G(proc.go:3236<br/>runtime-newproc) G --> H(proc.go:1170<br/>runtime-mstart) H --> I(在新创建的 p 和 m 上运行 runtime-main) 
runtime-osinit:赢得 CPU 中枢数。 runtime-schedinit:开动化法子运行环境(包括栈、内存分派器、垃圾回收、P等)。 runtime-newproc:创建一个新的 G 和 绑定 runtime.main。 runtime-mstart:启动线程 M。

注:来自@曹大的 《Go 法子的启动经过》和@全成的 《Go 法子是怎么跑起来的》,保举寰宇阅读。

开动化运行环境

昭着,咱们要商榷的是 runtime 里的 schedinit 方法,如下:

func schedinit() {  ...  stackinit()  mallocinit()  mcommoninit(_g_.m)  cpuinit()       // must run before alginit  alginit()       // maps must not be used before this call  modulesinit()   // provides activeModules  typelinksinit() // uses maps, activeModules  itabsinit()     // uses activeModules   msigsave(_g_.m)  initSigmask = _g_.m.sigmask   goargs()  goenvs()  parsedebugvars()  gcinit()   ... } 

从用途来看,尽头昭着, mallocinit 方法会进行内存分派器的开动化,咱们赓续往下看。

开动化内存分派器

mallocinit

接下来咱们阐发的分析一下 mallocinit 方法,在带领经过中, mallocinit 主要承担 Go 法子的内存分派器的开动化动作,而今上帝要是针对捏造内存地址这块进行拆解,如下:

func mallocinit() {  ...  if sys.PtrSize == 8 {   for i := 0x7f; i >= 0; i-- {    var p uintptr    switch {    case GOARCH == "arm64" && GOOS == "darwin":     p = uintptr(i)<<40 | uintptrMask&(0x0013<<28)    case GOARCH == "arm64":     p = uintptr(i)<<40 | uintptrMask&(0x0040<<32)    case GOOS == "aix":     if i == 0 {      continue     }     p = uintptr(i)<<40 | uintptrMask&(0xa0<<52)    case raceenabled:     ...    default:     p = uintptr(i)<<40 | uintptrMask&(0x00c0<<32)    }    hint := (*arenaHint)(mheap_.arenaHintAlloc.alloc())    hint.addr = p    hint.next, mheap_.arenaHints = mheap_.arenaHints, hint   }  } else {       ...  } } 
判断刻下是 64 位如故 32 位的系统。 从 0x7fc000000000~0x1c000000000 脱手建筑保留地址。 判断刻下 GOARCH、GOOS 或是否开启了竞态查验,字据不同的情况苦求不同大小的承接内存地址,而这里的 p 是行将要要苦求的承接内存地址的脱手地址。 保存刚刚计较的 arena 的信息到 arenaHint 中。

可能会有小伙伴问,为什么要判断是 32 位如故 64 位的系统,这是因为不同位数的捏造内存的寻址领域是不同的,因此要进行分辨,不然会出现高位的捏造内存映射问题。而在苦求保留空间时,咱们会往往提到 arenaHint 结构体,它是 arenaHints链内外的一个节点,结构如下:

type arenaHint struct {  addr uintptr  down bool  next *arenaHint } 
addr:arena 的肇始地址 down:是否临了一个 arena next:下一个 arenaHint 的指针地址

那么这里猖獗提到的 arena 又是什么东西呢,这其实是 Go 的内存管制中的主见,Go Runtime 会把苦求的捏造内存分为三个大块,如下:

博彩入口

image

spans:纪录 arena 区域页号和 mspan 的映射关连。 bitmap:记号 arena 的使用情况,在功能上来讲,会用于记号 arena 的哪些空间地址如故保存了对象。 arean:arean 其实即是 Go 的堆区,是由 mheap 进行管制的,它的 MaxMem 是 512GB-1。而在功能上来讲,Go 会在开动化的时候苦求一段承接的捏造内存空间地址到 arean 保留住来,在信得过需要苦求堆上的空间时再从 arean 中取出来处理,这时候就会回荡为物理内存了。

在这里的话,你需要默契 arean 区域在 Go 内存里的作用就不错了。

mmap

咱们刚刚通过上述的分析,如故知谈 mallocinit 的用途了,关联词你可能如故会有狐疑,即是咱们之前所看到的 mmap 系统调用,和它又有什么关连呢,如何就关联到沿途了,接下来咱们先沿途来望望更基层的代码,如下:

func sysAlloc(n uintptr, sysStat *uint64) unsafe.Pointer {  p, err := mmap(nil, n, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)  ...  mSysStatInc(sysStat, n)  return p }  func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer {  p, err := mmap(v, n, _PROT_NONE, _MAP_ANON|_MAP_PRIVATE, -1, 0)  ... }  func sysMap(v unsafe.Pointer, n uintptr, sysStat *uint64) {  ...  munmap(v, n)  p, err := mmap(v, n, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_FIXED|_MAP_PRIVATE, -1, 0)   ... } 

在 Go Runtime 中存在着一系列的系统级内存调用方法,本文触及的主要如下:

皇冠客服飞机:@seo3687 sysAlloc:从 OS 系统上苦求清零后的内存空间,调用参数是 _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE,得到的效率需进行内存对皆。 sysReserve:从 OS 系统中保留内存的地址空间,这时候还莫得分派物理内存,调用参数是 _PROT_NONE, _MAP_ANON|_MAP_PRIVATE,得到的效率需进行内存对皆。 sysMap:示知 OS 系统咱们要使用如故保留了的内存空间,调用参数是 _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_FIXED|_MAP_PRIVATE。

看上去好像很挑升义意义的神志,关联词 mallocinit 方法在开动化时,到底是在那处触及了 mmap 方法呢,名义看不出来,如下:

for i := 0x7f; i >= 0; i-- {  ...  hint := (*arenaHint)(mheap_.arenaHintAlloc.alloc())  hint.addr = p  hint.next, mheap_.arenaHints = mheap_.arenaHints, hint } 

履行上在调用 mheap_.arenaHintAlloc.alloc() 时,调用的是 mheap 下的 sysAlloc 方法,而 sysAlloc 又会与 mmap 方法产生调用关连,况且这个方法与旧例的 sysAlloc 还不大不异,如下:

var mheap_ mheap ... func (h *mheap) sysAlloc(n uintptr) (v unsafe.Pointer, size uintptr) {  ...  for h.arenaHints != nil {   hint := h.arenaHints   p := hint.addr   if hint.down {    p -= n   }   if p+n < p {    v = nil   } else if arenaIndex(p+n-1) >= 1<<arenaBits {    v = nil   } else {    v = sysReserve(unsafe.Pointer(p), n)   }   ... } 

你不错惊喜的发现 mheap.sysAlloc 里其实有调用 sysReserve 方法,而 sysReserve 方法又正恰是从 OS 系统中保留内存的地址空间的特定方法,是不是很惊喜,一切似乎都串起来了。

小结

在本节中,咱们先写了一个测试法子,然后字据尽头规的排查想路进行了一步步的追踪怀疑,举座经过如下:

通过 top 或 ps 等号令,搜检进度运行情况,分析基础主张。 通过 pprof 或 runtime.MemStats 等用具链搜检应用运行情况,分析应用层面是否有裸露或者哪儿高。 通过 vmmap 号令,搜检进度的内存映射情况,分析是不是进度捏造空间内的某个区域比拟高,举例:分享库等。 通过 dtruss 号令,搜检法子的系统调用情况,分析可能出现的一些特殊举止,举例:在分析中咱们发现 mmap 方法调用的比例是比拟高的,那咱们有充分的事理怀疑 Go 在启动时就进行了多数的内存空间保留。 通过上述的分析,细目可能是在哪个法子苦求了那么多的内存空间后,再到 Go Runtime 中去作念进一步的源码分析,因为源码眼前,了无奥秘,没必要靠猜。

从论断上而言,VSZ(进度捏造内存大小)与分享库等莫得太大的关连,主要与 Go Runtime 存在平直关联,也即是在前图中示意的运行时堆(malloc)。调遣到 Go Runtime 里,即是在 mallocinit 这个内存分派器的开动化阶段里进行了一定量的捏造空间的保留。

而保留捏造内存空间时,受什么影响,又是一个形而上学问题。从源码上来看,主要如下:

受不同的 OS 系统架构(GOARCH/GOOS)和位数(32/64 位)的影响。 受内存对皆的影响,计较转头的内存空间大小是需要经过对皆才会进行保留。

总结

咱们通过一步局面分析,进修了 Go 会在那处,又会受什么身分,去调用了什么方法保留了那么多的捏造内存空间,关联词咱们深信会忧心进度捏造内存(VSZ)高,会不会存在问题呢,我分析如下:

VSZ 并不虞味着你信得过使用了那些物理内存,因此是不需要顾忌的。 VSZ 并不会给 GC 带来压力,GC 管制的是进度履行使用的物理内存,而 VSZ 在你履行使用它之前,它并莫得过多的代价。 VSZ 基本都是不成拜访的内存映射,也即是它并莫得内存的拜访权限(不允许读、写和实施)。

想考

苹果手机如何下载皇冠APP

看到这里舒连气儿,因为 Go VSZ 的高,并不会对咱们产生什么尽头实质性的问题,关联词又仔细一想,为什么 Go 要苦求那么多的捏造内存呢?

总体酌量如下:

Go 的盘算是酌量到 arena 和 bitmap 的后续使用,先提早保留了通盘内存地址空间。 Go Runtime 和应用的迟缓使用,深信也会脱手履行的苦求和使用内存,这时候 arena 和 bitmap 的内存分派器就只需要将预先苦求好的内存地址空间保留更正为履行可用的物理内存就好了,这神志不错极大的普及遵循。

参考

High virtual memory allocation by golang

GO MEMORY MANAGEMENT

GoBigVirtualSize

欧博官网

GoProgramMemoryUse

曹大的 Go 法子的启动经过

全成大佬的 Go 法子是怎么跑起来的

欧神的 go-under-the-hood

 



>> 重庆时时彩真人百家乐网站故障_迎大运 成王人“大运专线 好意思丽巴士”..

>> 皇冠体育直播间 | 本周日晚23:00,曼城将主场迎战切尔西,蓝月军...

>> 电竞比赛博彩网站导航(www.sovereignathletichq...

>> 开云娱乐城博彩平台信誉评价_走近“欧洲旅行嘉年华”中的艺术博物馆..

>> 网络赌博app | 俞敏洪游览五台山时指出景区教导牌上的英语翻译装假..

>> 澳门娱乐城 | 季中冠军赛JDG夺冠,卓定得益最佳诞辰礼物..

>> 重庆时时彩真人百家乐网站故障_迎大运 成王人“大运专线 好意思丽巴士”..

>> 乐鱼百家乐博彩平台注册送优先体验_6月起左手财神右手贵东说念主四大生肖..

>> AG龙虎斗博彩赛车_一步让你走出捧场型东谈主格..

>> 电竞比赛博彩网站导航(www.sovereignathletichq...