48

Мой коллега использует приложение, которое потребляет много памяти, что делает систему слишком медленной. Можно ли обмениваться памятью с другими компьютерами через Интернет?

Система имеет 8 ГБ оперативной памяти, а приложение потребляет более 6 ГБ.

16 ответов16

160

Я рассматривал только отдельное приложение, которое запускается на "стандартной" машине без возможности просто установить его в другом месте или использовать специальное оборудование или программное обеспечение. Другие ответы (правильно) относятся к миграции программного обеспечения или выделенному оборудованию для выполнения задачи.

Любой способ "совместного использования ОЗУ" через сеть будет подвержен ограничениям этой сетевой среды. Поскольку даже гигабитный Ethernet ограничен до 100 МБ / с (мегабайт), это означает, что скорость вашей "оперативной памяти" также будет ограничена.

100 МБ / с - это ничтожная доля скорости оперативной памяти, которая в действительности находится в вашей системе. Ваша программа будет мучительно медленной и она будет работать на компьютере с начала 90-х годов.

Современные жесткие диски для последовательного чтения и записи немного быстрее, чем этот. SSD в несколько раз быстрее.

Это игнорирует проблемы с задержкой, которые сделают вашу программу на порядок медленнее.

Из-за медлительности и других связанных с этим технических проблем это не та проблема, которую кто-либо, вероятно, когда-либо считал стоящей попытки решить для "домашних" или "офисных" систем. Дешевле и эффективнее покупать больше оперативной памяти, если это необходимо.

Просто купите больше оперативной памяти или даже SSD для файла подкачки. Нет другого способа сделать это, который не требует безумного количества работы или оборудования для небольшой выгоды.

73

Просто для полноты: InfiniBand обеспечивает прямой доступ к памяти других машин.

Тем не менее, это требует:

  • Переключатель InfiniBand
  • InfiniBand добавить на карту в каждой машине
  • Приложение должно быть запрограммировано специально для использования этого

Он НЕ работает в существующей сети, он требует полностью независимой инфраструктуры для всех подключенных узлов. Это также не работает через Интернет

18
Is there any alternative solution?

Это сильно зависит от характера данных.

Вы можете запустить 2 разных сервера MySQL на 2 разных машинах.

Затем разделите данные на 1/2 и напишите программу, чтобы автоматически узнать, на какой сервер перейти.

Конечно, это можно масштабировать до любого количества серверов, если они у вас есть.

15

Да, это довольно легко сделать (и я сделал это для бездисковых систем, нуждающихся в обмене), используя протокол Network Block Device.

Установите nbd-server на компьютер сервера и настройте его для автоматического создания файлов для каждого хоста.

Убедитесь, что на ваших клиентских компьютерах NBD скомпилирован в их ядра, а затем настройте их для обмена на устройство, смонтированное на NBD. Пакет nbd-client может помочь.

Извините, если вышеупомянутое немного расплывчато - машины, на которых я это сделал, недоступны отсюда; Возможно, я смогу заполнить детали, когда у меня будет к ним доступ.

Существует альтернативная реализация NBD-сервера под названием nbdkit ; Я ничего не знаю об этом.

9

Учитывая небольшие, неважные детали: «Windows 10, рабочая станция имеет 8 ГБ ОЗУ», на самом деле есть только один здравый ответ: покупайте больше оперативной памяти и меньше занимайтесь ерундой.

Покупка SSD и размещение файла подкачки будет следующим лучшим вариантом, но на самом деле ... купите больше оперативной памяти.

Обслуживание файла подкачки ("разделяемой памяти") по сети, конечно, возможно, но это очень плохая идея. Несмотря на то, что существуют пограничные случаи, когда время доступа по сети будет лучше, чем доступ к локальному диску, это не имеет значения для вашего случая использования, потому что вам нужно стабильно низкое время доступа и высокая пропускная способность одновременно. Помните, что вы не ожидаете ошибок на одну или две страницы, вы постоянно меняетесь местами. Если вы не готовы заплатить пару тысяч, вы не сможете приблизиться к покупке ОЗУ или SSD.

8 ГБ недостаточно для запуска Windows 10 и приложения, требующего памяти, одновременно. Этого едва хватает для одновременного запуска Word, Excel и Outlook. Это как раз та типичная совершенно непригодная "полная ерунда корпоративная установка", с которой миллионам людей приходится жить каждый день на своих рабочих ноутбуках. Вложите 100-200 валют в другой модуль памяти, и он амортизирует свою стоимость в течение недели (вещи, которые занимали минуты, теперь занимают секунды, а время - деньги - к несчастью, это часто трудно получить в голову вашему местному прилавку бобов).

В качестве альтернативы, если у вас есть машина, вы можете использовать NTLite, чтобы сократить дерьмо Windows 10, уменьшив объем используемой памяти. Или вы можете просто отключить 80% ненужных сервисов. Это кажется невероятным, но возможно запустить последнюю версию Windows с менее чем 2 ГБ ОЗУ.

Но на самом деле, просто купите ОЗУ ... это намного быстрее и проще, чем тратить часы своего драгоценного времени на сокращение чушь Windows.

6

Простая альтернатива - запустить приложение на удаленном ПК, возможно, под специальной учетной записью пользователя, и просто управлять им через RDP, VNC или любым другим удобным способом.

5

Другой вариант - временно развернуть приложение в среде, в которой оперативная память может быть легко увеличена или уменьшена.

Я бы посмотрел на экземпляр Amazon AWS, размер которого можно изменить за одну перезагрузку.

IE небольшой экземпляр, такой как C5.large, имеет 4 ГБ оперативной памяти и 2 ядра, и стоит 2,04 доллара США в день для Linux, или 4,26 доллара США в день для установки Windows. Дисковое пространство EBS является дополнительной платой и линейно масштабируется с выделением ГБ.

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

  • m5.4xlarge - это 64 ГБ оперативной памяти и 16 ядер, по цене 18,44 долларов США в день или 36,10 долларов США в день для Windows.
  • r4.8xlarge составляет 244 ГБ и 32 ядра, по цене 51,07 долларов США / день или 86,40 долларов США / день с окнами.
  • x1.32xlarge - 1952 ГБ и 128 ядер, по цене 320,12 долл. США в день или 461,43 долл. США в день с Windows

Или самый большой ...

  • x1e.32xlarge - 3904 ГБ и 128 ядер, по цене 640,52 долл. США / день или 781,82 долл. США / день с окнами. Если вашему коллеге нужно больше, чем это, то проблема должна быть переписана более оптимальным образом.

https://www.ec2instances.info/ поможет вам выбрать подходящий размер. Обратите внимание, что некоторые места стоят дороже, чем другие. Сингапур и Северная Калифорния дорогие. Однако ваша виртуальная машина ничего не стоит, когда она не работает, кроме дискового пространства.

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

4

Попросите ИТ-отдел купить больше оперативной памяти для вашего ПК и продемонстрируйте необходимость, используя скриншот использования приложения в диспетчере задач.

4

Как уже говорили другие, это технически возможно, но не стоит.

Однако, если вы хотите ускорить использование вашего компьютера, вы можете перенести некоторые из ваших приложений на удаленный сервер.

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

Я имею в виду пример сервера, который проверяет мой код каждый раз, когда я нажимаю на модификацию. Идея такого решения заключается в том, что оно ограничено конкретными вариантами использования.

3

Для этого есть коммерческое решение через компанию Kove (http://kove.net/). Для работы на "объединительной плате" требуется инфраструктура Infiniband (Ethernet работает нормально), хотя иногда могут быть доступны и другие параметры, например RoCE, в зависимости от особенностей. Они предоставляют ряд прозрачных интерфейсов, позволяющих осуществлять интеграцию с нулевым изменением кода, и API для обхода ядра с более прямым доступом к процессору (т. Е. Избегая нагрузки на ядро). С точки зрения производительности, это зависит от вашего приложения. Если вы связаны с процессором, то влияние может быть минимальным (что может быть удивительным). Если вы ограничиваете пропускную способность памяти на локальном хосте, они предоставят вам больший объем памяти, но вы будете ограничены уже существующим узким местом. В этом случае выгодно ли рабочей нагрузке иметь больший объем памяти, чем можно поместить в коробку, и не исчерпать ОЗУ? Мы видели (очень) хорошие результаты с библиотеками машинного обучения виртуализации и Python. Высокопроизводительные высокопроизводительные приложения, как правило, хуже, но мы использовали API-интерфейсы C и сумели сохранить приемлемый уровень производительности при одновременном снижении количества узлов (количество узлов было для оперативной памяти, а не для циклов ЦП), что является плюсом по сравнению с MPI , Трудно сказать, является ли это хорошим решением для вашего коллеги, но это вариант, который вы можете рассмотреть. Надеюсь, это поможет. Чтобы быть ясным, я не работаю на Kove, и у меня нет финансовых стимулов, но я сотрудничаю с ними в течение ряда лет и думаю, что эта технология может существенно повлиять на то, как выполняются определенные вычисления.

2

Другая точка зрения - возможно, проблема не в ограничении системных ресурсов, а в расточительном приложении, которое пишет ваш друг. 6 ГБ ОЗУ ужасно много памяти.

Тот факт, что многие другие приложения чрезмерно раздуты, не обязательно означает, что приложение вашего друга должно быть одним из них. Использование различных методов программирования может снизить требования к памяти при одновременном повышении скорости. Например, если приложение загружает весь набор данных в память, а затем работает с ним, это будет гораздо более расточительным, чем, например, хранение данных в (локальной или удаленной) базе данных SQL с несколькими выбранными индексами и доступ к ней там. Сделайте так, чтобы это обрабатывало данные по блокам, если это возможно, вместо того, чтобы загружать все сразу. Структуры в памяти тоже могут быть расточительными. Свободная память, когда вы закончите с этим. Не загружайте в RAM то, что вы можете вместо карты памяти. И сотни других советов ...

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

1

Таким образом, пользователь попросил Как использовать память по сети. Нет, если это хорошая идея. Так вот на самом деле, как вы могли бы сделать это.

Я не говорю, что это хорошая идея, или она будет эффективной, но она должна работать.

  • Компьютер 1 = "мастер" - где выполняется код
  • Компьютер 2 = "ребенок" - донор памяти

Я предполагаю, что это не Windows Server, где вы могли бы создать точку монтирования iSCSI.

Компьютер 1 Шаги:

  1. Загрузите бесплатный виртуальный диск Dataram: http://memory.dataram.com/products-and-services/software/ramdisk
  2. Создайте виртуальный диск и отформатируйте его в NTFS - инструкции доступны на их сайте
  3. В Disk Manager создайте файл VHD на виртуальном диске, отформатированном с помощью NTFS.
  4. Предоставьте общий доступ к корневому каталогу Ramdisk по сети с SMB - щелкните правой кнопкой мыши диск, откройте общий доступ и поделитесь этой папкой.

Компьютер 2 шага:

  1. Подключите общий диск из cild на диск
  2. Смонтируйте виртуальный жесткий диск, созданный на шаге 3 выше, в диспетчере дисков
  3. Переместите расположение локального файла подкачки на подключенный виртуальный жесткий диск с помощью команды Переместить файл подкачки Windows.
  4. Удалите все остальные записи файла подкачки.

Готово!

Предостережения - вы можете пропустить чепуху VHD, если Windows позволяет вам переместить файл подкачки в общий сетевой ресурс. Там не так много примеров этого онлайн (по понятным причинам).

Может произойти полная нестабильность системы или что-то еще полностью. Никто на самом деле не знает, что произойдет.

0

Поскольку вы упоминаете "ОЗУ" для совместного использования по сети, а не просто "память" любого рода, окончательный ответ будет теоретически да, практически нет.

В то время как другие типы памяти, такие как хранилище и другие временные данные, регулярно передаются по сети по разным причинам и причинам. Точно так же технически возможно, что ОЗУ может быть разделено по сети при необходимости. Но производительность и стоимость будут слишком высокими, чтобы их можно было реализовать в реальном мире.

Оперативная система использует оперативную память или оперативную память в качестве рабочего пространства, поэтому на ней выполняется множество операций чтения / записи. В средней системе скорость передачи данных с ОЗУ является самой высокой по сравнению с другими частями. Если вы размещаете ОЗУ в сети, вам нужна очень высокая скорость передачи данных, а стоимость будет очень высока, даже если это возможно технически. За небольшую часть затрат на обновление скорости сети вы получите оперативную память для вашей машины.

0

Это действительно зависит от того, какой тип приложения и для чего используется оперативная память.

Например, многие веб-приложения могут использовать оперативную память по сети, подключившись к серверу memcached . Это позволит хранить данные кэша (и другие данные, к которым должен быть быстрый доступ) на другом компьютере с большим объемом оперативной памяти.

Конечно, это зависит от приложения и требует приложения, которое может использовать memcached. Это не поможет вам открыть второй экземпляр слабины, так как браузер не поддерживает использование такого кеш-сервера.

0

Приложения обычно работают в виртуальной памяти, поэтому их требования к виртуальной памяти могут превышать доступную физическую память системы без каких-либо последствий, кроме производительности. Операционная система будет просто страница виртуальной памяти на диск , чтобы освободить физическую память по мере необходимости в любой момент для активного использования. Обычно это прекрасно работает для приложений, которые имеют разумную локальность (активность в любой момент времени несколько ограничена областями виртуальной памяти приложения). Если приложение имеет плохую локальность (постоянно ссылается на память по всему виртуальному пространству), оно будет работать плохо, если вся его виртуальная память не будет размещена в физической памяти (вся ее виртуальная память является резидентной).

Итак, здесь есть несколько возможностей:

  • Если приложение просто занимает много места, но имеет хорошую локальность, вы сможете запустить его на компьютере, который у вас есть; производительность может быть приемлемой, может или не может заметно улучшиться на компьютере, имеющем больше памяти.
  • Если он имеет плохую локальность, вы можете обнаружить, что он все равно будет работать на доступном компьютере, но очень плохо. (Это похоже на тебя)
  • Обновите (предполагается) магнитный диск до твердотельного диска (они значительно быстрее)
  • Добавьте память на имеющийся у вас компьютер (если возможно)
  • Вам может понадобиться найти компьютер, который имеет больше памяти и запустить его на этом.
  • Усовершенствуйте приложение, чтобы оно занимало меньшую виртуальную площадь или улучшало локальность (если вы являетесь или связаны с автором приложения).

Идея использования памяти на удаленном компьютере заключается в создании сетевого файла подкачки. Теоретически, это может работать, но на практике производительность будет намного лучше, если файл подкачки будет локальным для компьютера (его собственный жесткий диск) из-за пропускной способности сети и задержки. Неважно, будет ли удаленная система размещать файл подкачки в своей памяти или на диске, узким местом (наиболее существенным ограничителем производительности) будет сеть. Это будет особенно актуально через Интернет, но также будет верно, даже если удаленный компьютер находится рядом в той же локальной сети.

-1

Вместо того, чтобы делиться оперативной памятью, просто закодируйте это приложение, чтобы создать дочерний файл .exe, который будет запускаться на сетевом ПК и делать то же самое на этом ПК.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .