C Программа на Linux для исчерпания памяти

При выполнении SQL Server 2005 можно записать пользовательская агрегатная функция CLR для обработки этого.

версия C#:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;
using Microsoft.SqlServer.Server;
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,MaxByteSize=8000)]
public class CSV:IBinarySerialize
{
    private StringBuilder Result;
    public void Init() {
        this.Result = new StringBuilder();
    }

    public void Accumulate(SqlString Value) {
        if (Value.IsNull) return;
        this.Result.Append(Value.Value).Append(",");
    }
    public void Merge(CSV Group) {
        this.Result.Append(Group.Result);
    }
    public SqlString Terminate() {
        return new SqlString(this.Result.ToString());
    }
    public void Read(System.IO.BinaryReader r) {
        this.Result = new StringBuilder(r.ReadString());
    }
    public void Write(System.IO.BinaryWriter w) {
        w.Write(this.Result.ToString());
    }
}

19
задан skaffman 8 December 2009 в 08:40
поделиться

7 ответов

Linux «сверх фиксирует» память. Это означает, что физическая память предоставляется процессу только тогда, когда процесс впервые пытается получить к ней доступ, а не , а не при первом выполнении malloc . Чтобы отключить это поведение, сделайте следующее (как root):

echo 2 > /proc/sys/vm/overcommit_memory

Затем попробуйте запустить вашу программу.

10
ответ дан 30 November 2019 в 03:48
поделиться

Вы должны писать в выделенные блоки. Если вы просто запрашиваете память, Linux может просто выделить резерв для памяти, но ничего не будет выделено до тех пор, пока к памяти не будет осуществлен доступ.

13
ответ дан 30 November 2019 в 03:48
поделиться

Linux по умолчанию использует то, что я люблю называть «оппортунистическим распределением». Это основано на наблюдении, что ряд реальных программ выделяет больше памяти, чем они фактически используют. Linux использует это, чтобы разместить в памяти немного больше: он выделяет страницу памяти только тогда, когда она используется, а не когда она выделяется с помощью malloc (или mmap, или sbrk).

У вас может быть больше успеха, если вы сделаете что-то вроде этого внутри вашего цикла:

memset(malloc(1024*1024L), 'w', 1024*1024L);
3
ответ дан 30 November 2019 в 03:48
поделиться

Малоизвестный факт (хотя он хорошо документирован) - вы можете (как root) запретить убийце OOM заявлять ваш процесс (или любой другой процесс) в качестве одной из его жертв. Вот отрывок из чего-то прямо из моего редактора, где я (на основе данных конфигурации) блокирую всю выделенную память, чтобы ее не выгружали, и (необязательно) говорю убийце OOM не беспокоить меня:

static int set_priority(nex_payload_t *p)
{
    struct sched_param sched;
    int maxpri, minpri;
    FILE *fp;
    int no_oom = -17;

    if (p->cfg.lock_memory)
        mlockall(MCL_CURRENT | MCL_FUTURE);

    if (p->cfg.prevent_oom) {
        fp = fopen("/proc/self/oom_adj", "w");
        if (fp) {
            /* Don't OOM me, Bro! */
            fprintf(fp, "%d", no_oom);
            fclose(fp);
        }
    }

Я не показывая, что я делаю с параметрами планировщика, поскольку это не имеет отношения к вопросу.

Это предотвратит получение OOM-убийцей вашего процесса до того, как он получит шанс произвести (в данном случае) желаемый эффект. Фактически, вы также заставите большинство других процессов записать на диск.

Короче говоря, чтобы увидеть фейерверк очень быстро ...

3
ответ дан 30 November 2019 в 03:48
поделиться

Взгляните на эту программу. Когда памяти больше не хватает, malloc начинает возвращать 0

#include <stdlib.h>
#include <stdio.h>

int main()
{
  while(1)
  {
    printf("malloc %d\n", (int)malloc(1024*1024));
  }
  return 0;
}
2
ответ дан 30 November 2019 в 03:48
поделиться

On a 32-bit Linux system, the maximum that a single process can allocate in its address space is approximately 3Gb.

This means that it is unlikely that you'll exhaust the memory with a single process.

On the other hand, on 64-bit machine you can allocate as much as you like.

As others have noted, it is also necessary to initialise the memory otherwise it does not actually consume pages.

malloc will start giving an error if EITHER the OS has no virtual memory left OR the process is out of address space (or has insufficient to satisfy the requested allocation).

Linux's VM overcommit also affects exactly when this is and what happens, as others have noted.

1
ответ дан 30 November 2019 в 03:48
поделиться

Однажды мне было скучно, и я сделал это. Это поглощает всю память и требуется принудительная перезагрузка, чтобы заставить ее снова работать.

#include <stdlib.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    while(1)
    {
        malloc(1024 * 4);
        fork();
    }
}
0
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: