Как перезагрузить все запущенные приложения от области подкачки в RAM?

Собственного ATI нужно избежать любой ценой.

Я пытался использовать тот приблизительно в 2001 - (возможно, было собственным или открытым, я забываю).. это составило мою систему.

Я пытался использовать тот в 2011 - он составил мою систему.

До ATI собирают их дерьмо, я остался бы хорошо далеко от их продукта.

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

Работа Nvidia хорошо, но может помешать установке ультрасовременных или пользовательских ядер.

Intel кажется самой низкой спецификацией, я не использовал их, но казаться вложить капитал в открытый исходный код, я знаю, что некоторые парни Red Hat клянутся ими.

20
14.08.2013, 21:55
4 ответа

Если Вы действительно имеете достаточно RAM в наличии снова, можно использовать эту последовательность (в качестве корня):

$ swapoff -a
$ swapon -a

(для принуждения явной загрузки всех приложений)

(предполагающий, что Вы используете Linux),

16
27.01.2020, 19:44
  • 1
    Даже если Вы не сделаете IIRC, то он переместит как можно больше данных. В то время как это может повредить кэш и co., это иногда полезно. –  Maciej Piechotka 22.01.2011, 00:32

Следующий быстрый-и-грязный сценарий Python выводит память процесса к stdout. Это имеет побочный эффект загрузки, любой выгрузил файл подкачки или отображаемый файл. Назовите его как cat_proc_mem 123 456 789 где аргументами являются идентификаторы процесса.

Этот сценарий абсолютно характерен для Linux. Это может быть адаптируемо к другим системам с подобным /proc структура (Солярис?), но забывают о работе его, например, *BSD. Даже на Linux, Вы, возможно, должны изменить определение c_pid_t и значения PTRACE_ATTACH и PTRACE_DETACH. Это - сценарий доказательства принципа, не предназначенный как пример хороших практик программирования. Используйте на Ваш собственный риск.

Linux делает память к процессу доступной как /proc/$pid/mem. Только определенные диапазоны адресов читаемы. Эти диапазоны могут быть найдены путем чтения информация размещения в ОЗУ из текстового файла /proc/$pid/maps. Псевдофайл /proc/$pid/mem не может быть считан всеми процессами, которые имеют разрешение считать его: процесс читателя, должно быть, звонил ptrace(PTRACE_ATTACH, $pid).

#!/usr/bin/env python
import ctypes, re, sys

## Partial interface to ptrace(2), only for PTRACE_ATTACH and PTRACE_DETACH.
c_ptrace = ctypes.CDLL("libc.so.6").ptrace
c_pid_t = ctypes.c_int32 # This assumes pid_t is int32_t
c_ptrace.argtypes = [ctypes.c_int, c_pid_t, ctypes.c_void_p, ctypes.c_void_p]
def ptrace(attach, pid):
    op = ctypes.c_int(16 if attach else 17) #PTRACE_ATTACH or PTRACE_DETACH
    c_pid = c_pid_t(pid)
    null = ctypes.c_void_p()
    err = c_ptrace(op, c_pid, null, null)
    if err != 0: raise SysError, 'ptrace', err

## Parse a line in /proc/$pid/maps. Return the boundaries of the chunk
## the read permission character.
def maps_line_range(line):
    m = re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])', line)
    return [int(m.group(1), 16), int(m.group(2), 16), m.group(3)]

## Dump the readable chunks of memory mapped by a process
def cat_proc_mem(pid):
    ## Apparently we need to ptrace(PTRACE_ATTACH, $pid) to read /proc/$pid/mem
    ptrace(True, int(pid))
    ## Read the memory maps to see what address ranges are readable
    maps_file = open("/proc/" + pid + "/maps", 'r')
    ranges = map(maps_line_range, maps_file.readlines())
    maps_file.close()
    ## Read the readable mapped ranges
    mem_file = open("/proc/" + pid + "/mem", 'r', 0)
    for r in ranges:
        if r[2] == 'r':
            mem_file.seek(r[0])
            chunk = mem_file.read(r[1] - r[0])
            print chunk,
    mem_file.close()
    ## Cleanup
    ptrace(False, int(pid))

if __name__ == "__main__":
    for pid in sys.argv[1:]:
        cat_proc_mem(pid)

См. также больше информации о /proc/$pid/mem.

unswap () {
  cat_proc_mem "$@" >/dev/null
}
18
27.01.2020, 19:44
  • 1
    Это - серьезно одна из самых прохладных вещей, которые я когда-либо видел на обмене стека. Престижность за регистрацию этого! Существует столько хороших самородков для получения по запросу от этого. –  Dan 08.11.2015, 06:40
  • 2
    Unformatunately я не смог получить эту работу сценария. С python 2 это показывает ошибку, что значение r [0] является слишком большим. На python 3 (после устранения нескольких незначительных проблем) я получаю OSError: [Errno 5] ошибка ввода/вывода в блоке = mem_file.read (r[1] - r [0]) и программа, на которой я использовал его, зависает в обоих случаях. –  barteks2x 21.03.2017, 15:35
  • 3
    @Barteks2x я сожалею, у меня нет времени прямо сейчас для создания этого сценария защищенным от ошибки. Это действительно работает на меня, по крайней мере, на машинах, которые не имеют слишком многих ограничений безопасности (техника использует некоторые интерфейсы отладки, которые отключены на укрепленных установках). Программа приостановлена, в то время как она прослеживается, отправьте ей SIGCONT (kill -CONT 1234 где 1234 является PID) возобновлять его. –  Gilles 'SO- stop being evil' 21.03.2017, 16:47
  • 4
    @Barteks2x: я добавил некоторую проверку ошибок здесь. Это заставляет сценарий работать даже над IOErrors от/dev/dri/card0 и OverflowErrors от [vsyscall]. (Это также распечатывает то, чем проблемная область была). –  hackerb9 24.07.2017, 20:57

swapon/swapoff будет абсолютно ясный Ваша область подкачки, но можно освободить часть от него через/proc файловую систему также. Вы хотите первый:

# To free pagecache
echo 1 > /proc/sys/vm/drop_caches

# To free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches

# To free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches

с помощью http://linux-mm.org/Drop_Caches

0
27.01.2020, 19:44
  • 1
    Память Подкачки, по определению, не кэш. Отбрасывание кэшей очень вряд ли изменит что-либо в подкачке. Кроме того, желательно использовать sysctl вместо того, чтобы непосредственно переписать файлы в proc файловой системе. sysctl vm.drop_caches=X. Кроме того, sysctl легче к sudo. –  Juliano 22.01.2011, 01:59
  • 2
    @julian = поршень + подкачивает iirc. И приложения и кэши используют виртуальную память. Однако я думаю, что op должен очистить все кроме кэшей от подкачки, поскольку я сомневаюсь, что это действительно, что производит его. –  xenoterracide 22.01.2011, 10:17
  • 3
    @xenoterracide: кэши только имеют смысл в реальной, Оперативной памяти. Бессмысленно сохранить кэш в подкачке, они - полные противоположности. Подкачка является медленной памятью, используемой, когда система коротка на физической RAM; кэш является быстродействующей памятью, используемой, когда система имеет много неиспользованной физической RAM. –  Juliano 22.01.2011, 14:49
  • 4
    @juliano да, который я знаю, но я полагаю, что они оба хранятся с помощью виртуальной памяти, хотя возможно, что кэши только хранятся в RAM. честно отбрасывание кэшей не имеет никакого смысла здесь, imo. –  xenoterracide 22.01.2011, 15:58

Только для полноты, GDB может вывести образ процесса. Я не проверял, что это не подкачивает его, но это имеет к---нет никакого другого способа считать целую память процесса:
gdb -p $mypid
сопровождаемый
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core

6
27.01.2020, 19:44
  • 1
    gcore $pid также доступно за пределами gdb (как маленький сценарий обертки) –  Tobu 15.01.2014, 14:36
  • 2
    gcore не имеет никакого способа записать в/dev/null, который является тем, что Вы хотели бы, если бы Вы пытались сдержать процесс в память. Однако можно сделать это в единственной команде как так: gdb --batch -p $pid -ex "gcore /dev/null" 2>/dev/null –  hackerb9 24.07.2017, 21:11

Теги

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