~을 위한웹 서버 데이터를 (tmpfs) RAM 디스크로 어떻게 이동합니까? (실험), 나는 몇 가지 생각, 메모 및 관련 콘텐츠를 제공했습니다. 내 생각 전체가 건전하고 건전한지 들어보고 싶고,이런 실험도 가능하다.
tmpfs
시작 시 충분히 큰( ) RAM 디스크를 자동으로 생성합니다.동일한 스크립트를 사용하고, www 데이터를 복사하고, 소유권을 조정하는 등 거의 모든 작업을 수행합니다.
로그는 PCIe 3.0 x4 유형 NVMe SSD에 유지됩니다.
# nvme list Node SN Model Namespace Usage Format FW Rev --------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 < SN REDACTED > Samsung SSD 970 EVO Plus 2TB 1 360.10 GB / 2.00 TB 512 B + 0 B 2B2QEXM7
노트북에는 32GB RAM(DDR4 2400MHz, 듀얼 채널)이 있는데 사용되지 않는 것 같습니다.
노트북의 배터리는 몇 분 정도 지속되었지만 여전히 사용할 수 있었습니다.
노트북이 구형 UPS에 연결되어 있어 배터리를 교체해야 할 수도 있습니다(참고).
내 업링크 속도는 (거의) 100Mbits/s입니다.https://www.speedtest.net/result/16116969035
7세대 인텔 기반이고 AES-NI 명령어 세트가 있는 이 노트북은 재부팅하는 일이 거의 없습니다.
나는 Timeshift-GTK 애플리케이션을 사용하여 일주일에 한 번씩 스냅샷을 찍습니다. 매월 2개의 SSD를 전체 복제합니다.
운영 체제는 Ubuntu 22.04 기반 Linux Mint 21.3 Cinnamon 64비트입니다. 현재 커널 버전은 6.5.0-27입니다.
이것이 이 실험에 대한 나의 메모이고, 나에게 묻는다면 그것은 흥미로운 메모입니다.
나에게 유일하게 어려운 부분은 이를 자동화하기 위한 쉘 스크립트를 작성하는 것이었다고 생각합니다. 동시에 재미있을 수도 있습니다. 어디서부터 시작해야 할지, 무엇을 잊지 말아야 할지 잘 모르겠습니다. 모든 팁에 감사드립니다.
답변1
이런 실험이 가능합니다.
예, 사소한 것 같습니다. 언급한 문제를 해결하려면 다음을 수행해야 합니다.
부팅 시 충분히 큰(tmpfs) RAM 디스크를 자동으로 생성합니다.
이는 /etc/fstab의 항목으로 수행할 수 있습니다. 예를 들어 다음과 같습니다.
tmpfs /var/www/ramdisk tmpfs noauto,size=4g
4GB(최대, 왜 지정했는지는 모르겠지만 요청한 이유는 확실하지 않음) 램디스크를 설정합니다. Tmpfs는 항상 파일을 저장하는 데 필요한 RAM만 사용하며 크기가 정의되어 있습니다. 어쨌든, 당신의 선택!
noauto
선택 사항이지만 웹 서버를 시작하는 데 램디스크만 필요하므로 그때까지 램 디스크 설정을 기다릴 수 있습니다. 합리적인 초기화 시스템은 장치 마운트와 부팅 간의 종속성을 알고(알려진 경우) 활성화합니다. "가장 편리한 주문". 즉, 나중에 부팅할 때만 필요한 RAM 디스크를 설정하여 초기 부팅을 방해하지 않도록 합시다.
동일한 스크립트를 사용하고, www 데이터를 복사하고, 소유권을 조정하는 등 거의 모든 작업을 수행합니다.
물론 시작 시 스크립트를 실행하여 이를 수행할 수 있습니다. 너무 복잡하게 만들 필요는 없습니다 cp -ar /var/www/disk/* /var/www/ramdisk/
. (소스에 올바른 권한이 설정되어 있다고 가정). 또는 tar 또는 squashfs 아카이브를 대상에 압축을 풀 수 있습니다. Linux의 많은 것들은 소유권과 권한을 유지합니다!
데이터 복사 스크립트가 부팅 시스템의 일부가 되어 웹 서버가 시작되기 전에 항상 실행되도록 하려고 합니다. systemd에서는 이것이 특히 쉽습니다. /etc/systemd/system/에 "setup-ramdisk.service" 파일을 배치하고 다음과 같은 내용을 입력해야 합니다.
[Unit]
Description=Set up contents of RAM disk
[Service]
Type=oneshot
# We're going for the "extract from compressed archive" approach here,
# going for `cp -ar` would be just as valid
ExecStart=unsquashfs -d /var/www/ramdisk /var/www/disk/archive.squash
# Tell the system we need that ramdisk mount
RequiresMountsFor=/var/www/ramdisk
# Make sure that if started at the same time as a web server,
# we need to be done before the web server is started
Before=nginx.service httpd.service apache2.service
[Install]
WantedBy=multi-user.target
systemctl enable --now setup-ramdisk
따라서 (향후 출시를 위해) 활성화하고 즉시 실행하는 것은 매우 쉽습니다 . 또한 웹 서버의 .service 파일(아마도 /usr/lib/systemd/system/에 있음)을 수정하여 목록을 표시 Wants=setup-ramdisk.service
하고After=setup-ramdisk.service
하지만,
아이디어가 합리적이고 신뢰할 수 있음
아니요. 두 가지 이유가 있습니다.
내 업링크 속도는 (거의) 100Mbits/s입니다.
사랑스러운. SSD는 이보다 훨씬 빠르며, 임의 액세스 시간은 TCP 연결 설정의 지터보다 낮아야 하며, SSD 액세스를 캐시할 만큼 RAM이 충분합니다.첫 번째파일이 요청되면 파일을 요청한 당사자는 RAM 디스크에서 읽는 것과 SSD에서 직접 읽는 것의 차이를 알 수 없으며 RAM을 다른 목적으로 사용하지 않는 한 파일은 그대로 유지됩니다. Linux의 RAM 버퍼에 관계없이 캐시됩니다. RAM 디스크는 필요한 데이터가 RAM을 차지하는 것 외에는 아무것도 수행하지 않습니다.꼭 필요하지 않을 수도 있다.
그래서 하나도 안 보여느끼다이 실험에서는. 병목 현상은 분명히 스토리지가 아니라 네트워크에서 발생합니다. 그렇지 않은 경우에도 RAM이 충분하므로 파일 시스템과 블록 장치 버퍼링을 통해 다른 소프트웨어에서 요구하지 않는 한 파일이 이미 RAM 디스크에 있는 것처럼 두 번째로 빠르게 파일에 액세스할 수 있습니다. RAM과 파일은 이미 이 버퍼에서 삭제되어 여유 RAM을 얻습니다. 하지만 그런 경우에는 말이지더 나쁜서버가 RAM 디스크에 파일을 저장하는 경우 해당 RAM 요구 사항이 실패하거나(무언가 충돌이 발생함) 메모리 부족 킬러에 의해 종료되거나(따라서 시스템이 불안정해짐) RAM 요청이 다른 항목을 푸시하게 됩니다. 소프트웨어 및 해당 데이터를 RAM에서 스왑 공간으로 전송합니다. 이는 성능에 치명적인 영향을 미칠 수 있습니다. 특히 이것이 웹 서버에 영향을 미치는 경우에는 그럴 가능성이 높습니다. 많은 경우에 파일을 제공할 수 없으며 이제는 퇴거를 고려해보세요.
요약하면 다음과 같습니다.
- 스토리지는 병목 현상이 발생하지 않으므로 필요하지 않습니다.
- RAM 캐시는 Linux에서 무료 기능이므로 필요하지 않습니다. 실제로 많은 양의 RAM이 필요한 경우에는 해로울 수도 있습니다.