通过减少线程切换提高服务器性能

This commit is contained in:
xiongziliang 2019-03-21 22:28:12 +08:00
parent 6238f5aa58
commit b78c14a2a3
9 changed files with 33 additions and 65 deletions

@ -1 +1 @@
Subproject commit 15d6ebbf2e09ccde3dc0e467df84401dc57b475d Subproject commit 843a323834e9b6c164dcd620b196e3742c39f016

View File

@ -232,7 +232,7 @@ inline bool HttpSession::checkLiveFlvStream(){
(*this) << SocketFlags(kSockFlags); (*this) << SocketFlags(kSockFlags);
try{ try{
start(mediaSrc); start(getPoller(),mediaSrc);
}catch (std::exception &ex){ }catch (std::exception &ex){
//该rtmp源不存在 //该rtmp源不存在
shutdown(); shutdown();
@ -683,36 +683,21 @@ inline void HttpSession::sendNotFound(bool bClose) {
void HttpSession::onWrite(const Buffer::Ptr &buffer) { void HttpSession::onWrite(const Buffer::Ptr &buffer) {
weak_ptr<HttpSession> weakSelf = dynamic_pointer_cast<HttpSession>(shared_from_this()); _ticker.resetTime();
async([weakSelf,buffer](){ _ui64TotalBytes += buffer->size();
auto strongSelf = weakSelf.lock(); send(buffer);
if(!strongSelf) {
return;
}
strongSelf->_ticker.resetTime();
strongSelf->_ui64TotalBytes += buffer->size();
strongSelf->send(buffer);
});
} }
void HttpSession::onWrite(const char *data, int len) { void HttpSession::onWrite(const char *data, int len) {
BufferRaw::Ptr buffer(new BufferRaw); BufferRaw::Ptr buffer(new BufferRaw);
buffer->assign(data,len); buffer->assign(data,len);
_ticker.resetTime();
weak_ptr<HttpSession> weakSelf = dynamic_pointer_cast<HttpSession>(shared_from_this()); _ui64TotalBytes += buffer->size();
async([weakSelf,buffer](){ send(buffer);
auto strongSelf = weakSelf.lock();
if(!strongSelf) {
return;
}
strongSelf->_ticker.resetTime();
strongSelf->_ui64TotalBytes += buffer->size();
strongSelf->send(buffer);
});
} }
void HttpSession::onDetach() { void HttpSession::onDetach() {
safeShutdown(); shutdown();
} }
std::shared_ptr<FlvMuxer> HttpSession::getSharedPtr(){ std::shared_ptr<FlvMuxer> HttpSession::getSharedPtr(){

View File

@ -203,7 +203,7 @@ inline void RtmpPusher::send_metaData(){
sendRtmp(pkt->typeId, _ui32StreamId, pkt->strBuf, pkt->timeStamp, pkt->chunkId ); sendRtmp(pkt->typeId, _ui32StreamId, pkt->strBuf, pkt->timeStamp, pkt->chunkId );
}); });
_pRtmpReader = src->getRing()->attach(); _pRtmpReader = src->getRing()->attach(getPoller());
weak_ptr<RtmpPusher> weakSelf = dynamic_pointer_cast<RtmpPusher>(shared_from_this()); weak_ptr<RtmpPusher> weakSelf = dynamic_pointer_cast<RtmpPusher>(shared_from_this());
_pRtmpReader->setReadCB([weakSelf](const RtmpPacket::Ptr &pkt){ _pRtmpReader->setReadCB([weakSelf](const RtmpPacket::Ptr &pkt){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();

View File

@ -336,28 +336,22 @@ void RtmpSession::sendPlayResponse(const string &err,const RtmpMediaSource::Ptr
onSendMedia(pkt); onSendMedia(pkt);
}); });
_pRingReader = src->getRing()->attach(); _pRingReader = src->getRing()->attach(getPoller());
weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this()); weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this());
SockUtil::setNoDelay(_sock->rawFD(), false); SockUtil::setNoDelay(_sock->rawFD(), false);
_pRingReader->setReadCB([weakSelf](const RtmpPacket::Ptr &pkt) { _pRingReader->setReadCB([weakSelf](const RtmpPacket::Ptr &pkt) {
auto strongSelf = weakSelf.lock();
if (!strongSelf) {
return;
}
strongSelf->async([weakSelf, pkt]() {
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if (!strongSelf) { if (!strongSelf) {
return; return;
} }
strongSelf->onSendMedia(pkt); strongSelf->onSendMedia(pkt);
}); });
});
_pRingReader->setDetachCB([weakSelf]() { _pRingReader->setDetachCB([weakSelf]() {
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if (!strongSelf) { if (!strongSelf) {
return; return;
} }
strongSelf->safeShutdown(); strongSelf->shutdown();
}); });
_pPlayerSrc = src; _pPlayerSrc = src;
if (src->getRing()->readerCount() == 1) { if (src->getRing()->readerCount() == 1) {
@ -442,18 +436,12 @@ void RtmpSession::onCmd_pause(AMFDecoder &dec) {
} else { } else {
weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this()); weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this());
_pRingReader->setReadCB([weakSelf](const RtmpPacket::Ptr &pkt) { _pRingReader->setReadCB([weakSelf](const RtmpPacket::Ptr &pkt) {
auto strongSelf = weakSelf.lock();
if(!strongSelf) {
return;
}
strongSelf->async([weakSelf,pkt]() {
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf) { if(!strongSelf) {
return; return;
} }
strongSelf->onSendMedia(pkt); strongSelf->onSendMedia(pkt);
}); });
});
} }
} }

View File

@ -38,7 +38,7 @@ FlvMuxer::FlvMuxer() {
FlvMuxer::~FlvMuxer() { FlvMuxer::~FlvMuxer() {
} }
void FlvMuxer::start(const RtmpMediaSource::Ptr &media) { void FlvMuxer::start(const EventPoller::Ptr &poller,const RtmpMediaSource::Ptr &media) {
if(!media){ if(!media){
throw std::runtime_error("RtmpMediaSource 无效"); throw std::runtime_error("RtmpMediaSource 无效");
} }
@ -46,7 +46,7 @@ void FlvMuxer::start(const RtmpMediaSource::Ptr &media) {
onWriteFlvHeader(media); onWriteFlvHeader(media);
std::weak_ptr<FlvMuxer> weakSelf = getSharedPtr(); std::weak_ptr<FlvMuxer> weakSelf = getSharedPtr();
_ring_reader = media->getRing()->attach(); _ring_reader = media->getRing()->attach(poller);
_ring_reader->setDetachCB([weakSelf](){ _ring_reader->setDetachCB([weakSelf](){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
@ -189,11 +189,11 @@ void FlvMuxer::stop() {
} }
///////////////////////////////////////////////////////FlvRecorder///////////////////////////////////////////////////// ///////////////////////////////////////////////////////FlvRecorder/////////////////////////////////////////////////////
void FlvRecorder::startRecord(const string &vhost, const string &app, const string &stream,const string &file_path) { void FlvRecorder::startRecord(const EventPoller::Ptr &poller,const string &vhost, const string &app, const string &stream,const string &file_path) {
startRecord(dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA,vhost,app,stream,false)),file_path); startRecord(poller,dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA,vhost,app,stream,false)),file_path);
} }
void FlvRecorder::startRecord(const RtmpMediaSource::Ptr &media, const string &file_path) { void FlvRecorder::startRecord(const EventPoller::Ptr &poller,const RtmpMediaSource::Ptr &media, const string &file_path) {
stop(); stop();
lock_guard<recursive_mutex> lck(_file_mtx); lock_guard<recursive_mutex> lck(_file_mtx);
//开辟文件写缓存 //开辟文件写缓存
@ -215,7 +215,7 @@ void FlvRecorder::startRecord(const RtmpMediaSource::Ptr &media, const string &f
//设置文件写缓存 //设置文件写缓存
setvbuf( _file.get(), fileBuf.get(),_IOFBF, FILE_BUF_SIZE); setvbuf( _file.get(), fileBuf.get(),_IOFBF, FILE_BUF_SIZE);
start(media); start(poller,media);
} }
void FlvRecorder::onWrite(const Buffer::Ptr &data) { void FlvRecorder::onWrite(const Buffer::Ptr &data) {

View File

@ -41,7 +41,7 @@ public:
virtual ~FlvMuxer(); virtual ~FlvMuxer();
void stop(); void stop();
protected: protected:
void start(const RtmpMediaSource::Ptr &media); void start(const EventPoller::Ptr &poller,const RtmpMediaSource::Ptr &media);
virtual void onWrite(const Buffer::Ptr &data) = 0; virtual void onWrite(const Buffer::Ptr &data) = 0;
virtual void onWrite(const char *data,int len) = 0; virtual void onWrite(const char *data,int len) = 0;
virtual void onDetach() = 0; virtual void onDetach() = 0;
@ -55,6 +55,7 @@ private:
RtmpMediaSource::RingType::RingReader::Ptr _ring_reader; RtmpMediaSource::RingType::RingReader::Ptr _ring_reader;
uint32_t _aui32FirstStamp[2] = {0}; uint32_t _aui32FirstStamp[2] = {0};
uint32_t _previousTagSize = 0; uint32_t _previousTagSize = 0;
}; };
class FlvRecorder : public FlvMuxer , public std::enable_shared_from_this<FlvRecorder>{ class FlvRecorder : public FlvMuxer , public std::enable_shared_from_this<FlvRecorder>{
@ -62,8 +63,8 @@ public:
typedef std::shared_ptr<FlvRecorder> Ptr; typedef std::shared_ptr<FlvRecorder> Ptr;
FlvRecorder(); FlvRecorder();
virtual ~FlvRecorder(); virtual ~FlvRecorder();
void startRecord(const string &vhost,const string &app,const string &stream,const string &file_path); void startRecord(const EventPoller::Ptr &poller,const string &vhost,const string &app,const string &stream,const string &file_path);
void startRecord(const RtmpMediaSource::Ptr &media,const string &file_path); void startRecord(const EventPoller::Ptr &poller,const RtmpMediaSource::Ptr &media,const string &file_path);
private: private:
virtual void onWrite(const Buffer::Ptr &data) override ; virtual void onWrite(const Buffer::Ptr &data) override ;
virtual void onWrite(const char *data,int len) override; virtual void onWrite(const char *data,int len) override;

View File

@ -124,7 +124,7 @@ RtpBroadCaster::RtpBroadCaster(const string &strLocalIp,const string &strVhost,c
bzero(&(peerAddr.sin_zero), sizeof peerAddr.sin_zero); bzero(&(peerAddr.sin_zero), sizeof peerAddr.sin_zero);
_apUdpSock[i]->setSendPeerAddr((struct sockaddr *)&peerAddr); _apUdpSock[i]->setSendPeerAddr((struct sockaddr *)&peerAddr);
} }
_pReader = src->getRing()->attach(); _pReader = src->getRing()->attach(nullptr);
_pReader->setReadCB([this](const RtpPacket::Ptr &pkt){ _pReader->setReadCB([this](const RtpPacket::Ptr &pkt){
int i = (int)(pkt->type); int i = (int)(pkt->type);
auto &pSock = _apUdpSock[i]; auto &pSock = _apUdpSock[i];

View File

@ -74,7 +74,7 @@ static int kSockFlags = SOCKET_DEFAULE_FLAGS | FLAG_MORE;
RtspSession::RtspSession(const Socket::Ptr &pSock) : TcpSession(pSock) { RtspSession::RtspSession(const Socket::Ptr &pSock) : TcpSession(pSock) {
//设置15秒发送超时时间 //设置15秒发送超时时间
pSock->setSendTimeOutSecond(15); pSock->setSendTimeOutSecond(45);
DebugL << get_peer_ip(); DebugL << get_peer_ip();
} }
@ -628,7 +628,7 @@ bool RtspSession::handleReq_Setup(const Parser &parser) {
if(!strongSelf) { if(!strongSelf) {
return; return;
} }
strongSelf->safeShutdown(); strongSelf->shutdown();
}); });
} }
int iSrvPort = _pBrdcaster->getPort(trackRef->_type); int iSrvPort = _pBrdcaster->getPort(trackRef->_type);
@ -731,20 +731,15 @@ bool RtspSession::handleReq_Play(const Parser &parser) {
if (!_pRtpReader && _rtpType != PlayerBase::RTP_MULTICAST) { if (!_pRtpReader && _rtpType != PlayerBase::RTP_MULTICAST) {
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this()); weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
_pRtpReader = pMediaSrc->getRing()->attach(useBuf); _pRtpReader = pMediaSrc->getRing()->attach(getPoller(),useBuf);
_pRtpReader->setDetachCB([weakSelf]() { _pRtpReader->setDetachCB([weakSelf]() {
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf) { if(!strongSelf) {
return; return;
} }
strongSelf->safeShutdown(); strongSelf->shutdown();
}); });
_pRtpReader->setReadCB([weakSelf](const RtpPacket::Ptr &pack) { _pRtpReader->setReadCB([weakSelf](const RtpPacket::Ptr &pack) {
auto strongSelf = weakSelf.lock();
if(!strongSelf) {
return;
}
strongSelf->async([weakSelf,pack](){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf) { if(!strongSelf) {
return; return;
@ -753,7 +748,6 @@ bool RtspSession::handleReq_Play(const Parser &parser) {
strongSelf->sendRtpPacket(pack); strongSelf->sendRtpPacket(pack);
} }
}); });
});
} }
}; };

View File

@ -192,7 +192,7 @@ static onceToken s_token([](){
auto path = http_root + "/" + vhost + "/" + app + "/" + stream + "_" + to_string(time(NULL)) + ".flv"; auto path = http_root + "/" + vhost + "/" + app + "/" + stream + "_" + to_string(time(NULL)) + ".flv";
FlvRecorder::Ptr recorder(new FlvRecorder); FlvRecorder::Ptr recorder(new FlvRecorder);
try{ try{
recorder->startRecord(dynamic_pointer_cast<RtmpMediaSource>(sender.shared_from_this()),path); recorder->startRecord(nullptr,dynamic_pointer_cast<RtmpMediaSource>(sender.shared_from_this()),path);
s_mapFlvRecorder[vhost + "/" + app + "/" + stream] = recorder; s_mapFlvRecorder[vhost + "/" + app + "/" + stream] = recorder;
}catch(std::exception &ex){ }catch(std::exception &ex){
WarnL << ex.what(); WarnL << ex.what();