이 문서에서는 주요 제로 복사 기술과 Linux의 제로 복사 기술에 적용 가능한 시나리오에 대해 설명합니다. 제로 카피 개념을 빠르게 확립하기 위해 일반적으로 사용되는 시나리오를 소개합니다:
Citation
서버 프로그램(웹 서버 또는 파일 서버)을 작성할 때 파일 다운로드는 기본 기능입니다. 이때 서버의 임무는 연결된 소켓에서 서버 호스트 디스크의 파일을 수정 없이 전송하는 것입니다. 이를 완료하기 위해 일반적으로 다음 코드를 사용합니다.
while((n = read(diskfd, buf, BUF_SIZE)) > 0) write(sockfd, buf , n);
기본 작업은 소켓에서 파일을 읽는 것입니다. 루프 내용의 디스크를 버퍼로 보낸 다음 버퍼의 내용을 소켓으로 보냅니다. 그러나 Linux I/O 작업은 기본적으로 버퍼링된 I/O로 수행됩니다. 여기서 사용되는 두 가지 주요 시스템 호출은 읽기와 쓰기입니다. 우리는 그 호출에서 운영 체제가 무엇을 하는지 모릅니다. 실제로 위의 I/O 작업 중에 여러 데이터 복사본이 발생했습니다.
응용 프로그램이 특정 데이터에 액세스하면 운영 체제는 먼저 해당 파일에 최근에 액세스했는지 여부와 파일 내용이 커널 버퍼에 캐시되어 있는지 확인합니다. 그렇다면 운영 체제는 buf를 직접 사용합니다. 읽기 시스템 호출 Address에서 제공하는 커널 버퍼의 내용을 buf에 지정된 사용자 공간 버퍼에 복사합니다. 그렇지 않은 경우 운영 체제는 먼저 디스크의 데이터를 커널 버퍼에 복사합니다. 이 단계는 현재 주로 DMA를 사용하여 전송한 다음 커널 버퍼의 내용을 사용자 버퍼에 복사합니다.
다음으로 write 시스템 호출은 사용자 버퍼의 내용을 네트워크 스택과 관련된 커널 버퍼에 복사하고, 마지막으로 소켓은 커널 버퍼의 내용을 네트워크 카드로 보냅니다. 너무 많이 말했으니 이해하기 쉽도록 사진을 살펴보겠습니다.
데이터 복사
从上图中可以看出,共产生了四次数据拷贝,即使使用了DMA来处理了与硬件的通讯,CPU仍然需要处理两次数据拷贝,与此同时,在用户态与内核态也发生了多次上下文切换,无疑也加重了CPU负担。
在此过程中,我们没有对文件内容做任何修改,那么在内核空间和用户空间来回拷贝数据无疑就是一种浪费,而零拷贝主要就是为了解决这种低效性。
什么是零拷贝技术(zero-copy)?
零拷贝主要的任务就是避免CPU将数据从一块存储拷贝到另外一块存储,主要就是利用各种零拷贝技术,避免让CPU做大量的数据拷贝任务,减少不必要的拷贝,或者让别的组件来做这一类简单的数据传输任务,让CPU解脱出来专注于别的任务。这样就可以让系统资源的利用更加有效。
我们继续回到引文中的例子,我们如何减少数据拷贝的次数呢?一个很明显的着力点就是减少数据在内核空间和用户空间来回拷贝,这也引入了零拷贝的一个类型:
让数据传输不需要经过 user space。
使用 mmap
我们减少拷贝次数的一种方法是调用mmap()来代替read调用:
buf = mmap(diskfd, len); write(sockfd, buf, len);
应用程序调用mmap(),磁盘上的数据会通过DMA被拷贝的内核缓冲区,接着操作系统会把这段内核缓冲区与应用程序共享,这样就不需要把内核缓冲区的内容往用户空间拷贝。应用程序再调用write(),操作系统直接将内核缓冲区的内容拷贝到socket缓冲区中,这一切都发生在内核态,最后,socket缓冲区再把数据发到网卡去。同样的,看图很简单:
mmap
읽는 대신 mmap을 사용하면 복사되는 데이터의 양이 많을 때 확실히 효율성이 향상됩니다. 그러나 mmap을 사용하면 비용이 발생합니다. mmap을 사용하면 몇 가지 숨겨진 함정에 직면할 수 있습니다. 예를 들어, 프로그램이 파일을 매핑했지만 다른 프로세스에 의해 파일이 잘리면 쓰기 시스템 호출이 잘못된 주소에 액세스하기 때문에 SIGBUS 신호에 의해 종료됩니다. SIGBUS 신호는 기본적으로 프로세스를 종료하고 코어 덤프를 생성합니다. 이러한 방식으로 서버가 중지되면 손실이 발생합니다.
일반적으로 우리는 이 문제를 피하기 위해 다음 솔루션을 사용합니다.
1. SIGBUS 신호에 대한 신호 처리기를 구축합니다.
SIGBUS 신호가 발견되면 신호 처리기는 단순히 반환되고 쓰기 시스템 호출이 발생합니다. 중단되기 전에 기록된 바이트 수가 반환되고 errno는 성공으로 설정되지만 이는 문제의 실제 핵심을 해결하지 못하기 때문에 좋지 않은 접근 방식입니다.
2. 파일 임대 잠금 사용
일반적으로 우리는 파일 설명자에 임대 잠금을 사용합니다. 다른 프로세스가 파일을 자르려고 할 때 커널에서 임대 잠금을 적용합니다. , 커널은 실시간 RTSIGNALLEASE 신호를 보내 사용자가 파일에 설정한 읽기-쓰기 잠금을 커널이 파괴하고 있음을 알려줍니다. 이러한 방식으로 프로그램이 불법 메모리에 액세스하고 SIGBUS에 의해 종료되기 전에 쓰기 시스템 호출이 중단됩니다. write는 쓴 바이트 수를 반환하고 errno를 성공으로 설정합니다.
mmap 파일을 작동하기 전에 잠그고 파일을 작동한 후에 잠금을 해제해야 합니다.
if(fcntl(diskfd, F_SETSIG, RT_SIGNAL_LEASE) == -1) { perror("kernel lease set signal"); return -1; } /* l_type can be F_RDLCK F_WRLCK 加锁*/ /* l_type can be F_UNLCK 解锁*/ if(fcntl(diskfd, F_SETLEASE, l_type)){ perror("kernel lease set type"); return -1; }
使用sendfile
从2.1版内核开始,Linux引入了sendfile来简化操作:
#include<sys/sendfile.h> ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
系统调用sendfile()在代表输入文件的描述符infd和代表输出文件的描述符outfd之间传送文件内容(字节)。描述符outfd必须指向一个套接字,而infd指向的文件必须是可以mmap的。这些局限限制了sendfile的使用,使sendfile只能将数据从文件传递到套接字上,反之则不行。
使用sendfile不仅减少了数据拷贝的次数,还减少了上下文切换,数据传送始终只发生在kernel space。
sendfile系统调用过程
在我们调用sendfile时,如果有其它进程截断了文件会发生什么呢?假设我们没有设置任何信号处理程序,sendfile调用仅仅返回它在被中断之前已经传输的字节数,errno会被置为success。如果我们在调用sendfile之前给文件加了锁,sendfile的行为仍然和之前相同,我们还会收到RTSIGNALLEASE的信号。
目前为止,我们已经减少了数据拷贝的次数了,但是仍然存在一次拷贝,就是页缓存到socket缓存的拷贝。那么能不能把这个拷贝也省略呢?
借助于硬件上的帮助,我们是可以办到的。之前我们是把页缓存的数据拷贝到socket缓存中,实际上,我们仅仅需要把缓冲区描述符传到socket缓冲区,再把数据长度传过去,这样DMA控制器直接将页缓存中的数据打包发送到网络中就可以了。
总结一下,sendfile系统调用利用DMA引擎将文件内容拷贝到内核缓冲区去,然后将带有文件位置和长度信息的缓冲区描述符添加socket缓冲区去,这一步不会将内核中的数据拷贝到socket缓冲区中,DMA引擎会将内核缓冲区的数据拷贝到协议引擎中去,避免了最后一次拷贝。
带DMA的sendfile
不过这一种收集拷贝功能是需要硬件以及驱动程序支持的。
使用splice
sendfile只适用于将数据从文件拷贝到套接字上,限定了它的使用范围。Linux在2.6.17版本引入splice系统调用,用于在两个文件描述符中移动数据:
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include<fcntl.h> ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsignedint flags);
splice调用在两个文件描述符之间移动数据,而不需要数据在内核空间和用户空间来回拷贝。他从fdin拷贝len长度的数据到fdout,但是有一方必须是管道设备,这也是目前splice的一些局限性。flags参数有以下几种取值:
SPLICEFMOVE :尝试去移动数据而不是拷贝数据。这仅仅是对内核的一个小提示:如果内核不能从pipe移动数据或者pipe的缓存不是一个整页面,仍然需要拷贝数据。Linux最初的实现有些问题,所以从2.6.21开始这个选项不起作用,后面的Linux版本应该会实现。
SPLICEFNONBLOCK :splice 操作不会被阻塞。然而,如果文件描述符没有被设置为不可被阻塞方式的 I/O ,那么调用 splice 有可能仍然被阻塞。
SPLICEFMORE: 후속 접속 호출에는 더 많은 데이터가 있을 것입니다.
스플라이스 호출은 Linux에서 제안한 파이프 버퍼 메커니즘을 활용하므로 적어도 하나의 설명자는 파이프여야 합니다.
위의 제로 복사 기술은 모두 사용자 공간과 커널 공간 사이의 데이터 복사를 줄여 구현되지만, 때로는 사용자 공간과 커널 공간 사이에서 데이터를 복사해야 하는 경우도 있습니다. 현재로서는 사용자 공간과 커널 공간의 데이터 복사 타이밍에 대해서만 작업할 수 있습니다. Linux는 일반적으로 시스템 오버헤드를 줄이기 위해 쓰기 시 복사를 사용합니다. 이 기술을 흔히 COW라고 합니다.
이 글에서는 지면 관계로 Copy-On-Write에 대해 자세히 소개하지 않습니다. 일반적인 설명은 다음과 같습니다. 여러 프로그램이 동시에 동일한 데이터 조각에 액세스하는 경우 각 프로그램은 이 데이터 조각에 대한 포인터를 갖습니다. 각 프로그램의 관점에서는 프로그램이 이 데이터 조각을 독립적으로 소유합니다. 데이터 내용이 수정되면 해당 데이터 내용은 프로그램 자체 응용 프로그램 공간에 복사되어야만 해당 데이터는 프로그램의 개인 데이터가 됩니다. 프로그램이 데이터를 수정할 필요가 없다면 데이터를 자체 애플리케이션 공간에 복사할 필요도 없습니다. 이렇게 하면 데이터 복사가 줄어듭니다. 작성 중 복사된 내용은 다른 글 작성에 활용될 수 있습니다. . .
또한 기존 Linux I/O에 O_DIRECT 마크를 추가하여 직접 I/O를 활성화하고 자동 캐싱을 방지하는 등 몇 가지 제로 복사 기술과 미성숙한 fbufs 기술이 있지만 이 기사에서는 아직 다루지 않았습니다. 모든 제로 복사 기술은 일반적인 기술 중 일부일 뿐입니다. 관심이 있다면 스스로 연구할 수도 있습니다. 일반적으로 성숙한 서버 측 프로젝트에서는 개선을 위해 커널의 I/O 관련 부분도 수정합니다. 데이터 전송 속도.
위 내용은 Linux의 제로카피 기술에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Linux의 5 가지 핵심 구성 요소는 커널, 쉘, 파일 시스템, 시스템 라이브러리 및 시스템 도구입니다. 1. 커널은 하드웨어 리소스를 관리하고 응용 프로그램에 서비스를 제공합니다. 2. Shell은 사용자와 시스템 간의 인터페이스 역할을하며 명령을 해석하고 실행합니다. 3. 파일 시스템은 데이터 저장 및 구성을 담당합니다. 4. 시스템 라이브러리는 프로그램 통화를 제공하기 위해 사전 컴파일 된 기능을 제공합니다. 5. 시스템 도구는 시스템 관리 및 유지 보수에 사용됩니다. 이러한 구성 요소는 Linux에게 강력한 기능과 유연성을 제공하기 위해 함께 작동합니다.

이 기사는 데비안 시스템의 OpenSSL 구성을 확인하여 시스템의 보안 상태를 신속하게 파악하는 데 도움이되는 몇 가지 방법을 소개합니다. 1. OpenSSL 버전을 먼저 확인하고 OpenSSL이 설치되었는지 확인 및 버전 정보를 확인하십시오. 터미널에 다음 명령을 입력하십시오. OpenSSLVERSION이 설치되지 않으면 시스템에 오류가 발생합니다. 2. 구성 파일을 봅니다. OpenSSL의 기본 구성 파일은 일반적으로 /etc/ssl/openssl.cnf에 있습니다. 텍스트 편집기 (예 : Nano)를 사용하여 Sudonano/etc/ssl/openssl.cnf이 파일에는 키, 인증서 경로 및 암호화 알고리즘과 같은 중요한 구성 정보가 포함되어 있습니다. 3. Ope를 활용하십시오

이 안내서는 데비안 시스템에서 Hadoop 개발 환경을 구축하는 방법에 대해 자세히 설명합니다. 1. Java Development Kit (JDK) 설치 먼저, OpenJDK를 설치하십시오 : sudoaptupdatesudoaptinstallopenjdk-11-jdk-yconfigure java_home 환경 변수 : 파일 끝에 sudonano/etc/환경 (실제 JDK 버전에 따라 경로 조정) : java_home = "/usr/lib/jvm/java-11-openjdk-amd64"저장 및 종료 다음 소스/등을 실행합니다

Debian 시스템에서 Hadoop 리소스를 효과적으로 관리하려면 다음 단계가 필요합니다. Hadoop 배포 : 먼저 Debian 시스템에 Hadoop의 설치 및 구성을 완료하십시오. 여기에는 Hadoop 배포 패키지 다운로드, 압축 압축, 환경 변수 설정 등과 같은 필요한 작업이 포함됩니다. 클러스터 구성 : 설치가 완료된 후 HDFS (Hadoop 분산 파일 시스템) 및 Yarn (YetanotherResourcenegotiator)의 설정을 포함하여 Hadoop 클러스터를 구성합니다. Core-Site.xml, hdfs-site.xml, mapred-site.x와 같은 코어 구성 파일을 수정해야합니다.

DebiantomCat 로그의 보안을 향상 시키려면 다음 주요 정책에주의를 기울여야합니다. 1. 권한 제어 및 파일 관리 : 로그 파일 권한 : 기본 로그 파일 권한 (640)은 액세스를 제한합니다. Catalina.sh 스크립트 (예 : 0027에서 0022로 변경)에서 Umask 값을 수정하거나 Log4J2 구성 파일에서 직접 제출을 설정하여 적절한 읽기 및 쓰기 권한을 보장하는 것이 좋습니다. 로그 파일 위치 : Tomcat 로그는 일반적으로/opt/tomcat/logs (또는 유사한 경로)에 있으며이 디렉토리의 권한 설정을 정기적으로 확인해야합니다. 2. 로그 회전 및 형식 : 로그 회전 : server.xml 구성

Tomcat 서버 로그의 경고 메시지는 응용 프로그램 성능 또는 안정성에 영향을 줄 수있는 잠재적 문제를 나타냅니다. 이러한 경고 정보를 효과적으로 해석하려면 다음 핵심 사항에주의를 기울여야합니다. 경고 내용 : 유형, 원인 및 가능한 솔루션을 명확히하기 위해 경고 정보를주의 깊게 연구하십시오. 경고 정보는 일반적으로 자세한 설명을 제공합니다. 로그 레벨 : Tomcat 로그에는 정보, 경고, 오류 등과 같은 다양한 수준의 정보가 포함되어 있습니다. "경고"레벨 경고는 치명적이지 않은 문제이지만주의가 필요합니다. 타임 스탬프 : 문제가 발생할 때의 시점을 추적하기 위해 경고가 발생하는 시간을 기록하고 특정 이벤트 또는 작업과의 관계를 분석하십시오. 컨텍스트 정보 : 경고 정보 전후에 로그 콘텐츠보기를 얻으십시오.

Tomcat 로그는 메모리 누출 문제를 진단하는 열쇠입니다. Tomcat 로그를 분석하면 메모리 사용 및 가비지 수집 (GC) 동작에 대한 통찰력을 얻을 수 있으며 메모리 누출을 효과적으로 찾아서 해결할 수 있습니다. 다음은 Tomcat 로그를 사용하여 메모리 누출 문제를 해결하는 방법입니다. 1. GC 로그 분석 먼저 자세한 GC 로깅을 활성화하십시오. 다음 JVM 옵션을 Tomcat 시작 매개 변수에 추가하십시오. -xx : printgcdetails-xx : printgcdatestamps-xloggc : gc. 분석 gc.log

데비안 시스템 하에서 아파치 로그가 서버 성능에 미치는 영향은 양날의 검으로 긍정적 인 영향과 잠재적 부정적인 영향을 미칩니다. 긍정적 인 측면 : 문제 진단 도구 : Apache Log는 서버에 모든 요청과 응답을 자세히 기록하며 빠르게 결함을 찾는 데 유용한 리소스입니다. 오류 로그를 분석하면 구성 오류, 권한 문제 및 기타 예외를 쉽게 식별 할 수 있습니다. 보안 모니터링 Sentinel : 액세스 로그는 악의적 인 공격 시도와 같은 잠재적 인 보안 위협을 추적 할 수 있습니다. 로그 감사 규칙을 설정하면 비정상적인 활동이 효과적으로 감지 될 수 있습니다. 성능 분석 어시스턴트 : 액세스 로깅 요청 빈도 및 리소스 소비를위한 가장 인기있는 페이지 또는 서비스를 분석하여 리소스 할당을 최적화합니다. 상단 또는 HTOP 등과 결합


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

Dreamweaver Mac版
시각적 웹 개발 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
