为什么在æ¯çº¿ç¨‹ç«žæŠ€åœºçš„æ•°é‡ä¸Žå†…存碎片之间存在æƒè¡¡ï¼Ÿ

时间:2017-05-15 14:41:45

标签: malloc

From the MallocInternals section of the wiki:

  

éšç€æ¥è‡ªçº¿ç¨‹ç¢°æ’žçš„压力增加,通过mmap创建é¢å¤–的竞技场以å‡è½»åŽ‹åŠ›ã€‚竞技场的数é‡ä¸Šé™æ˜¯ç³»ç»Ÿä¸­CPUæ•°é‡çš„å…«å€ï¼ˆé™¤éžç”¨æˆ·å¦æœ‰è¯´æ˜Žï¼Œè¯·å‚è§mallopt),这æ„味ç€çº¿ç¨‹è¾ƒå¤§çš„应用程åºä»ä¼šçœ‹åˆ°ä¸€äº›äº‰ç”¨ï¼Œä½†æƒè¡¡çš„是,会有更少的争用碎片。

为什么增加竞技场的数é‡ä¼šå¢žåŠ ç¢Žç‰‡ï¼Ÿæœ‰è¶£çš„是,通过严格é™åˆ¶å†…存竞技场到2(通过MALLOC_ARENA_MAX),我已ç»èƒ½å¤Ÿå°†é©»ç•™é›†å¤§å°ï¼ˆä¸ä»…虚拟集大å°ï¼‰å‡å°‘è¿‘50%。

malloc中的大é‡æ¯çº¿ç¨‹å†…存竞技场如何导致内存碎片化并增加RSS?

2 个答案:

答案 0 :(得分:0)

å‡è®¾ä½ æœ‰300MB的分数。如果你将它划分为8个竞技场,那么你最终将获得更多"赔率和结果"内存,它都ä¸è¶³ä»¥æ»¡è¶³å¤§å†…存请求。作为一项规则,竞技场ä¸ä¼šåŠ¨æ€å¢žé•¿æˆ–缩å°ã€‚因此,如果你分é…一个竞技场,å ç”¨å®ƒçš„90%,最åŽ10%作为碎片(å义上等待æä¾›å°é¢åˆ†é…),它对你的大é‡åˆ†é…没有帮助。

你将它分æˆæ›´å¤šçš„竞技场,越多"赔率和结æŸï¼†ï¼ƒ34;你记忆中的记忆。所以:更多的竞技场等于更多的内部碎片。

答案 1 :(得分:-1)

竞技场有一个内部互斥é”,å¯ä»¥åŒæ—¶é”定ä¸åŒçº¿ç¨‹çš„内存访问。

如果你åªæœ‰ä¸€ä¸ªç«žæŠ€åœºï¼Œä¸€æ¬¡åªå…许一次内存æ“作,这会在执行新的分é…/å…费时å‡å°‘碎片。

如果增加竞技场的数é‡ï¼Œåˆ™æ„味ç€æ‚¨å…许多个线程åŒæ—¶åˆ†é…/释放内存,这会产生碎片,因为它ä¸æ˜¯åŽŸå­æ“作(请å‚阅“Malloc算法â€å’Œâ€œå…è´¹â€éƒ¨åˆ†ï¼‰ç®—法“)

8xCPU规则åªæ˜¯ç•™ä¸‹è¶³å¤Ÿçš„线程并å‘但以æŸç§æ–¹å¼é™åˆ¶å®ƒã€‚ 2个竞技场å¯èƒ½ï¼ˆå› ä¸ºè¿™ä¸æ˜¯è‡´å‘½ï¼‰å¯¼è‡´æ›´å¤šç¢Žç‰‡è€Œä¸æ˜¯1,所以竞争越多,碎片就越多,因为更多的内存æ“作åŒæ—¶å‘生。

为什么并å‘内存æ“作会导致碎片化(过度简化):因为分é…连续的大å—并且全部释放å°å—å—å˜å¾—越æ¥è¶Šéš¾ï¼Œå¹¶æ²¡æœ‰ç•™ä¸‹è¶³å¤Ÿçš„空间æ¥åˆ†é…新的大å—。

因此,如果您é™åˆ¶ç«žæŠ€åœºçš„æ•°é‡ï¼Œç»´æŠ¤å·¥ä½œï¼ˆåˆ†é…/å…费算法)ä¸ä¼šä¸ŽåŒæ—¶è¿è¡Œçš„其他竞技场竞争。

那么,为什么8xCPU?为什么ä¸åªæ˜¯2个竞技场(如你测试的那样)甚至åªæœ‰ä¸€ä¸ªï¼Ÿ 这完全å¯ä»¥åªè¿è¡Œ1个竞技场,但这æ„味ç€åªå…许一个线程åŒæ—¶ä½¿ç”¨å†…存,因此你会失去一些性能。如果é™åˆ¶ä¸º2个竞技场,那么åªæœ‰2个线程å¯ä»¥åŒæ—¶ä½¿ç”¨å†…存(æ¯ä¸ªç«žæŠ€åœºä¸€ä¸ªï¼‰ã€‚ 如果你有一个4-CPU机器åªæœ‰2个竞技场,åªæœ‰2个(这是竞技场é™åˆ¶ï¼‰çº¿ç¨‹å¯ä»¥åŒæ—¶æ“作(通过glibc)内存,这是浪费资æºï¼Œå› ä¸ºåªä½¿ç”¨äº†2个CPU。