Ist es falsch, sich "memfd" als "dem Prozess zuzuordnen, dem die Datei gehört"?


15

https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/

Theoretisch könnten Sie [ memfd_create()] Verhalten erreichen, ohne neue Systemaufrufe einzuführen:

int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);

(Beachten Sie, dass wir " /dev/shm" anstelle von " /tmp" verwenden können, um ein tmpfs hier besser zu gewährleisten .)

Daher ist die wichtigste Frage, warum zum Teufel wir einen dritten Weg brauchen?

[...]

  • Der Sicherungsspeicher wird dem Prozess zugeordnet, dem die Datei gehört, und unterliegt keinen Mount-Quoten.

^ Habe ich Recht, wenn ich denke, dass auf den ersten Teil dieses Satzes kein Verlass ist?

Der memfd_create () - Code wird buchstäblich als "nicht verknüpfte Datei in [a] tmpfs implementiert, die kernelintern sein muss ". Ich verstehe, dass die Verfolgung des Codes sich dadurch unterscheidet, dass keine LSM-Überprüfungen implementiert werden. Außerdem werden Memfds erstellt, um "Siegel" zu unterstützen, wie im Blog-Beitrag erläutert wird. Allerdings bin ich sehr skeptisch , dass memfds ist entfielen anders im Prinzip eine tmpfile.

Insbesondere, wenn der OOM-Killer klopft, denke ich nicht, dass er für den Speicher verantwortlich ist, der von memfds gehalten wird. Dies kann bis zu 50% des Arbeitsspeichers betragen - der Wert der Option size = für tmpfs . Der Kernel legt keinen anderen Wert für die internen tmpfs fest, daher würde er die Standardgröße von 50% verwenden.

Ich denke also, wir können generell damit rechnen, dass Prozesse, die eine große Speicherkapazität aufweisen, aber keine anderen signifikanten Speicherzuordnungen aufweisen, nicht durch OOM zerstört werden. Ist das korrekt?


2
Was die OOM-Scores angeht, scheint es sich um die Kernel-Funktion oom_badness zu handeln . Ich vermute also, wenn memfd_create nicht in einer / proc / {pid} / map auftaucht, wird es nicht gezählt. Die allgemeine Antwort ist also, dass sie getötet werden könnten, aber aufgrund der Verwendung von memfd_create keine große Punktzahl haben. Der Speicher für den fd kann von mehreren Prozessen gemeinsam genutzt werden, da mehrere Prozesse denselben fd erben / senden können.
danblack

Antworten:


1

Aufbauend auf @ danblacks Antwort:

Die Entscheidung basiert auf oom_kill_process()(etwas aufgeräumt):

for_each_thread(p, t) {
        list_for_each_entry(child, &t->children, sibling) {
                unsigned int child_points;

                child_points = oom_badness(child,
                        oc->memcg, oc->nodemask, oc->totalpages);
                if (child_points > victim_points) {
                        put_task_struct(victim);
                        victim = child;
                        victim_points = child_points;
                        get_task_struct(victim);
                }
        }
}

( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L974 )

Was davon abhängt oom_badness(), den besten Kandidaten zu finden:

child_points = oom_badness(child,
        oc->memcg, oc->nodemask, oc->totalpages);

oom_badness() macht:

points = get_mm_rss(p->mm) + get_mm_counter(p->mm, MM_SWAPENTS) +
        mm_pgtables_bytes(p->mm) / PAGE_SIZE;

( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L233 )

Wo:

static inline unsigned long get_mm_rss(struct mm_struct *mm)
{
        return get_mm_counter(mm, MM_FILEPAGES) +
                get_mm_counter(mm, MM_ANONPAGES) +
                get_mm_counter(mm, MM_SHMEMPAGES);
}

( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L966 )

Es sieht also so aus, als würde es anonyme Seiten zählen memfd_create().

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.