首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux虚拟内存限制

Linux虚拟内存限制
EN

Stack Overflow用户
提问于 2019-12-16 12:10:39
回答 1查看 1K关注 0票数 2

我正试图为进程(Tsw)分配内存。不幸的是,我不能分配超过1GB的虚拟内存(在for循环中分配2MB块)。在执行过程中没有限制更改命令。

下面是cat /proc/$(pidof Tsw)/limits命令的输出。

代码语言:javascript
复制
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             13633                13633                processes 
Max open files            1024                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       13633                13633                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

下面是top命令的部分输出(注意:/usr/bin/Tsw,从顶部开始的第三个进程):

代码语言:javascript
复制
Mem: 1082976K used, 990736K free, 0K shrd, 128K buff, 28136K cached
CPU:   0% usr   4% sys   0% nic  95% idle   0% io   0% irq   0% sirq
Load average: 1.07 0.36 0.13 1/242 2007
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
 1730  1690 root     S     179m   9%   2% /usr/bin/btsvc_main_9300
  585     1 root     S    45784   2%   2% /usr/bin/brsCore --test-software
 1691     1 root     S     997m  49%   0% /usr/bin/Tsw
 1941     1 root     S     121m   6%   0% /usr/sbin/unifi_helper_tsw --wifi-ptest --wifi-char-device /dev/unifiudi0 --wifi-ptest-firmware ptest/firmware/ptest_unifi_93xx_a07_ptdl.xbv --wifi-ptest-profile ptest/profile/unitest_profile_CSRC9xxx_Cust_BGA.txt --log-level-text CsrWifiPtestApp..A
 1687  1683 root     S     119m   6%   0% /usr/sbin/unifi_helper_tsw --wifi-char-device /dev/unifi0 --wifi-on --wifi-restart-on-error --wifi-exit-on-error --wifi-exit-on-unplug --wifi-address 00:1C:C1:A2:5D:FF --wifi-mib --wifi-add-interface ff:ff:ff:ff:ff:ff
 1693     1 root     S    70452   3%   0% /usr/bin/avTSWCdspAudio.exe /usr/lib/audiomanager/routing/libavPluginRoutingDirana.so
 1219     1 root     S    66740   3%   0% /usr/bin/TSWNav_GNSS
 1215     1 root     S    63460   3%   0% /usr/bin/dlt-system -c /etc/dlt-system.conf
 1039     1 root     S    50464   2%   0% /usr/bin/avDiranaBoot.exe -t DIRANA3 -p /run/audio/dirana_boot.pipe -r 0 -d 0
 1216     1 root     S    48400   2%   0% /usr/bin/RadioAppTSW
 1493     1 root     S    47184   2%   0% /usr/bin/ssw_pers_pccl_hwi_svc
 1494     1 root     S    47180   2%   0% /usr/bin/ssw_pers_pccl_early_svc
 1690     1 root     S    35672   2%   0% /usr/bin/btsvc_main_9300
 1692     1 root     S    30516   1%   0% /usr/bin/tsw-apple-authic-info
    1     0 root     S    30060   1%   0% {systemd} /sbin/init
 1225     1 root     S    28224   1%   0% /usr/bin/TSWNav_Gyro
 1224     1 root     S    28220   1%   0% /usr/bin/TSWNav_Accel
 1212     1 root     S    26968   1%   0% /usr/bin/tsw-ipc-sample
  793     1 root     S    19532   1%   0% /usr/bin/ssw_pers_nba_svc
  622     1 root     S     6656   0%   0% /usr/lib/systemd/systemd-journald
 1232     1 root     S     4440   0%   0% /usr/sbin/sshd -D
  746     1 root     S     3448   0%   0% /usr/lib/systemd/systemd-udevd
 2003  1691 root     S     2960   0%   0% sh -c mount -o remount, rw / && cd usr/bin && top -b -n 1 > statistics_after.txt
 2007  2003 root     R     2960   0%   0% top -b -n 1
 1682    30 root     S     2960   0%   0% {unififw} /bin/sh /usr/sbin/unififw 0 2
 1683  1682 root     S     2960   0%   0% {unififw} /bin/sh /usr/sbin/unififw 0 2
 1209     1 root     S     2708   0%   0% /usr/bin/dlt-daemon
 1694     1 root     S     2660   0%   0% /usr/sbin/conn_wifi_tsw
 1297     1 messageb S     2552   0%   0% /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
 1685  1682 root     S     1820   0%   0% logger -t unififw -p daemon.notice
 1625     1 root     S     1816   0%   0% ldattach -8e1s 2000000 19 /dev/ttymxc1
 1161     2 root     SW       0   0%   0% [irq/65-2010000.]
    8     2 root     SW       0   0%   0% [rcu_preempt]
 1629     2 root     SW       0   0%   0% [hydra-sdio-io]
  482     2 root     SW       0   0%   0% [kworker/u8:2]
    6     2 root     SW       0   0%   0% [kworker/u8:0]
  560     2 root     SW       0   0%   0% [ubi_bgt0d]
 1577     2 root     SW       0   0%   0% [file_server_thr]
  699     2 root     SW       0   0%   0% [rtp_parser]
  754     2 root     SW       0   0%   0% [rtp_isr_data_th]
 1464     2 root     SW       0   0%   0% [mmcqd/1]
    3     2 root     SW       0   0%   0% [ksoftirqd/0]
  701     2 root     SW       0   0%   0% [rtp_write_threa]
  755     2 root     SW       0   0%   0% [spi_send_thread]
  756     2 root     SW       0   0%   0% [rtp_parser_thre]
 1163     2 root     SW       0   0%   0% [spi2]
 1387     2 root     SW       0   0%   0% [irq/54-mmc0]
 1630     2 root     SW       0   0%   0% [hydra/complete]
   30     2 root     SW       0   0%   0% [kworker/u8:1]
 1210     2 root     SW       0   0%   0% [kworker/0:2]
    2     0 root     SW       0   0%   0% [kthreadd]
    4     2 root     SW       0   0%   0% [kworker/0:0]
    5     2 root     SW<      0   0%   0% [kworker/0:0H]
    7     2 root     SW       0   0%   0% [migration/0]
    9     2 root     SW       0   0%   0% [rcu_bh]
   10     2 root     SW       0   0%   0% [rcu_sched]
   11     2 root     SW       0   0%   0% [watchdog/0]
   12     2 root     SW       0   0%   0% [watchdog/1]
   13     2 root     SW       0   0%   0% [migration/1]
   14     2 root     SW       0   0%   0% [ksoftirqd/1]
   15     2 root     SW       0   0%   0% [kworker/1:0]
   16     2 root     SW<      0   0%   0% [kworker/1:0H]
   17     2 root     SW       0   0%   0% [watchdog/2]
   18     2 root     SW       0   0%   0% [migration/2]
   19     2 root     SW       0   0%   0% [ksoftirqd/2]
   20     2 root     SW       0   0%   0% [kworker/2:0]
   21     2 root     SW<      0   0%   0% [kworker/2:0H]
   22     2 root     SW       0   0%   0% [watchdog/3]
   23     2 root     SW       0   0%   0% [migration/3]
   24     2 root     SW       0   0%   0% [ksoftirqd/3]
   25     2 root     SW       0   0%   0% [kworker/3:0]
   26     2 root     SW<      0   0%   0% [kworker/3:0H]
   27     2 root     SW<      0   0%   0% [khelper]
   28     2 root     SW       0   0%   0% [kdevtmpfs]
   29     2 root     SW<      0   0%   0% [netns]
   37     2 root     SW       0   0%   0% [kworker/0:1]
   38     2 root     SW       0   0%   0% [kworker/1:1]
   39     2 root     SW       0   0%   0% [kworker/2:1]
   40     2 root     SW       0   0%   0% [kworker/3:1]
  241     2 root     SW<      0   0%   0% [writeback]
  243     2 root     SW<      0   0%   0% [bioset]
  245     2 root     SW<      0   0%   0% [kblockd]
  279     2 root     SW       0   0%   0% [khubd]
  307     2 root     SW       0   0%   0% [ipu1_task]
  308     2 root     SW       0   0%   0% [ipu1_task]
  309     2 root     SW       0   0%   0% [ipu2_task]
  310     2 root     SW       0   0%   0% [ipu2_task]
  343     2 root     SW       0   0%   0% [kswapd0]
  402     2 root     SW       0   0%   0% [fsnotify_mark]
  406     2 root     SW<      0   0%   0% [crypto]
  416     2 root     SW<      0   0%   0% [shm_workqueue]
  429     2 root     SW       0   0%   0% [kworker/2:2]
  474     2 root     SW<      0   0%   0% [usbdiag_queue]
  481     2 root     SW<      0   0%   0% [ci_otg]
  511     2 root     SW<      0   0%   0% [deferwq]
  544     2 root     SW       0   0%   0% [gpmi_statistics]
  700     2 root     SW<      0   0%   0% [rtp_admin]
  753     2 root     SW       0   0%   0% [spi0]
  795     2 root     SW       0   0%   0% [kworker/1:2]
 1040     2 root     SW       0   0%   0% [kworker/3:2]
 1152     2 root     SW       0   0%   0% [spi1]
 1177     2 root     SW       0   0%   0% [spi4]
 1269     2 root     SW<      0   0%   0% [vpu_wq]
 1406     2 root     SW       0   0%   0% [ubifs_bgt0_60]
 1409     2 root     SW       0   0%   0% [irq/56-mmc1]
 1413     2 root     SW       0   0%   0% [kworker/u8:3]
 1465     2 root     SW       0   0%   0% [mmcqd/1boot0]
 1466     2 root     SW       0   0%   0% [mmcqd/1boot1]
 1467     2 root     SW       0   0%   0% [mmcqd/1rpmb]
 1480     2 root     SW<      0   0%   0% [kworker/0:1H]
 1482     2 root     SW<      0   0%   0% [kworker/2:1H]
 1486     2 root     SW<      0   0%   0% [kworker/1:1H]
 1533     2 root     SW       0   0%   0% [jbd2/mmcblk1p3-]
 1534     2 root     SW<      0   0%   0% [ext4-dio-unwrit]
 1536     2 root     SW       0   0%   0% [jbd2/mmcblk1p2-]
 1537     2 root     SW<      0   0%   0% [ext4-dio-unwrit]
 1578     2 root     SW<      0   0%   0% [coredump_wq]
 1631     2 root     SW       0   0%   0% [service_mgr_thr]
 1679     2 root     SW<      0   0%   0% [unifi_workq]
 1717     2 root     SW       0   0%   0% [ubifs_bgt0_50]
 1758     2 root     SW       0   0%   0% [ubifs_bgt0_17]
 1759     2 root     SW       0   0%   0% [UNIFI_BH]
 1766     2 root     SW       0   0%   0% [hydra/complete]
 1936     2 root     SW       0   0%   0% [reader]
 1937     2 root     SW       0   0%   0% [writer]

下面是我分配的方法:

代码语言:javascript
复制
// RAM_SIZE = 1.5 Gb
// RAM_BLOCK_TEST = 2 Mb
#define RAM_SIZE (1024U * 1024U * 1536U) 
#define RAM_BLOCK_TEST (1024U * 1024U * 2U)

uint32_t uiMemBlockCount = 0;
// uiLoopNr = 768
uint32_t uiLoopNr = (uint32_t)RAM_SIZE/(uint32_t)RAM_BLOCK_TEST;
uint8_t* pcMemArray[uiLoopNr];

for(uiMemBlockCount = 0; uiMemBlockCount < uiLoopNr; uiMemBlockCount++)
{
    pcMemArray[uiMemBlockCount] = (uint8_t*)calloc(RAM_BLOCK_TEST, sizeof(uint8_t));
    if (NULL == pcMemArray[uiMemBlockCount])
    {
        printf("Allocated %u block(s) of memory with %d size", uiMemBlockCount, RAM_BLOCK_TEST);
        break;
    }
}

也许Linux操作系统中还有其他限制不允许我这样做呢?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 13:59:08

我发现了这个问题。

代码语言:javascript
复制
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
vmalloc : 0xc0800000 - 0xff000000 (1000 MB)
lowmem : 0x40000000 - 0xc0000000 (2048 MB)
modules : 0x3f000000 - 0x40000000 ( 16 MB)
.text : 0x40008000 - 0x40411ef4 (4136 kB)
.init : 0x40412000 - 0x4043ce80 ( 172 kB)
.data : 0x4043e000 - 0x404607c0 ( 138 kB)
.bss : 0x404607c0 - 0x40498208 ( 223 kB)

最低起点为0x40000000。

因此,每个进程的虚拟内存不能超过1GB。

这可以在内核配置中使用CONFIG_PAGE_OFFSET进行更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59356408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档